티스토리 뷰
💻JAVA 코드 바로보기
□ 문제 설명
체스에서 나이트(knight)는 아래 그림과 같이 동그라미로 표시된 8개의 방향중 한 곳으로 한 번에 이동이 가능합니다.
단, 나이트는 체스판 밖으로는 이동할 수 없습니다. 체스판의 각 칸의 위치는 다음과 같이 표기합니다.
예를 들어, A번줄과 1번줄이 겹치는 부분은 'A1'이라고 합니다.
나이트의 위치 pos가 매개변수로 주어질 때, 나이트를 한 번 움직여서 이동할 수 있는 칸은 몇개인지 return 하도록 solution 메소드를 완성해주세요.
매개변수 설명
나이트의 위치 pos가 solution 메소드의 매개변수로 주어집니다.
- pos는 A부터 H까지의 대문자 알파벳 하나와 1 이상 8이하의 정수 하나로 이루어진 두 글자 문자열입니다.
- 잘못된 위치가 주어지는 경우는 없습니다.
return 값 설명
나이트를 한 번 움직여서 이동할 수 있는 칸의 개수를 return 해주세요.
예시
pos | return |
"A7" | 3 |
예시 설명
나이트가 A7 위치에 있으면 아래 그림과 같이 왼쪽으로는 이동하지 못하고, 오른쪽으로는 맨 위를 제외한 나머지 세 칸으로 이동 가능합니다.
따라서, 3을 return 하면 됩니다.
□ 완성 코드
package Set01;
class Q3 {
public int solution(String pos) {
//이동할 수 있는 칸 count
int answer = 0;
// 나이트의 좌표를 x,y라고 할때 이동가능한 좌표를 표시하면
// (x-1,y+2), (x-2,y+1), (x-2,y-1), (x-1,y-2),
// (x+1,y-2), (x+2,y-1), (x+2,y+1), (x+1,y+2)
//나이트 위치 변환
int x = pos.charAt(0)-'A';
int y = pos.charAt(1)-'1';
//x좌표와 y좌표의 이동값을 담아놓은 배열
int[][] moved = {{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2}};
for(int i=0;i<moved.length;i++){
if(x+moved[i][0]>-1 && x+moved[i][0]<8 && y+moved[i][1]>-1 && y+moved[i][1]<8)
answer++;
}
return answer;
}
// The following is main method to output testcase.
public static void main(String[] args) {
Q3 sol = new Q3();
String pos = "A7";
int ret = sol.solution(pos);
// Press Run button to receive output.
System.out.println("Solution: return value of the method is " + ret + " .");
}
}
□ 코드 분석
체스판의 크기는 8x8로 고정되어있기 때문에,
움직인 말(knight)의 위치가 x좌표 0-7, y좌표 0-7 내부에 존재하면 answer의 값을 증가시키면 된다.
이때 나이트가 움직일 수 있는 경우의 수는 최대 8개로 아래와 같다.
(x-1,y+2), (x-2,y+1), (x-2,y-1), (x-1,y-2),
(x+1,y-2), (x+2,y-1), (x+2,y+1), (x+1,y+2)
좀 더 단순한 계산을 위해 x와 y값의 움직임을 각 경우의 수에 맞추어 배열에 넣었다.
따라서 주어진 나이트의 위치를 int형으로 변환시키고, 8번 반복하여 각 좌표가 체스판 내부에 있는지
if(x+moved[i][0]>-1 && x+moved[i][0]<8 && y+moved[i][1]>-1 && y+moved[i][1]<8)
를 통해 확인한다.
□ YBM 제공 코드
class Solution {
public int solution(String pos) {
int dx[] = {1,1,-1,-1,2,2,-2,-2};
int dy[] = {2,-2,-2,2,1,-1,-1,1};
int cx = pos.charAt(0) - 'A';
int cy = pos.charAt(1) - '0' - 1;
int ans = 0;
for (int i = 0; i < 8; ++i) {
int nx = cx + dx[i];
int ny = cy + dy[i];
if (nx >= 0 && nx < 8 && ny >= 0 && ny < 8)
ans++;
}
return ans;
}
// 아래는 테스트케이스 출력을 해보기 위한 main 함수입니다.
public static void main(String[] args) {
Solution sol = new Solution();
String ex0_pos = "A7";
int ex0_ret = sol.solution(ex0_pos);
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
System.out.printf("첫 번째 예제의 답은 %d 입니다.\n", 3);
System.out.printf("solution 함수의 반환 값은 %d 입니다.\n", ex0_ret);
}
}
위 코드에서 각 말이 움직인 값을 2차원 배열이 아닌 1차원 배열으로(x와 y값을 따로) 넣었다는 것을 제외하면 풀이방법은 동일하다. |
KimSky904 - Overview
Department of New Media Software. KimSky904 has 27 repositories available. Follow their code on GitHub.
github.com
'[코테] > [YBM-sample]' 카테고리의 다른 글
[Cospro Java 1급] 1차 8번_배달서비스 구현하기 (0) | 2022.01.21 |
---|---|
[Cospro Java 1급] 1차 7번_주식 사고팔기 (0) | 2022.01.20 |
[Cospro Java 1급] 1차 6번_계단 올라가기 (0) | 2022.01.19 |
[Cospro Java 1급] 1차 5번_가장 많이 득표한 후보 (0) | 2022.01.18 |
[Cospro Java 1급] 1차 4번_두개의 오름차순 배열 합치기 (0) | 2022.01.17 |
- C++
- Java
- 코스프로
- COSPRO 2급
- cospro기출
- 자바
- 배열
- CosPro
- 구름에듀 기출문제
- 프로그래머스
- 구름에듀
- 1급
- cospro기출문제
- lv1
- programmers
- groom
- lv2
- 배열활용문제
- YBM
- 코딩테스트
- c언어 기출문제
- groomedu
- 알고리즘
- C
- c언어
- YBM기출
- 구름 기출문제
- 연습문제
- Cos Pro
- 기출문제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |