코딩 테스트(Coding Test)/이것이 코딩 테스트다
[구현] 왕실의 나이트
배씌
2024. 11. 21. 21:44
문제
체스판은 8 x 8 좌표 평면이다. 특정한 한 칸에 나이트가 있다. 나이트는 이동할 때 다음과 같은 2가지 경우로 이동할 수 있다.
1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
| a | b | c | d | e | f | g | h | |
| 1 | ||||||||
| 2 | ||||||||
| 3 | ||||||||
| 4 | ||||||||
| 5 | ||||||||
| 6 | ||||||||
| 7 | ||||||||
| 8 |
이처럼 8 x 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오. 이때 행 위치는 1~8로 표현하고, 열 위치는 a~h로 표현한다.
입력 조건
- 첫째 줄에 8 x 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.
출력 조건
- 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
입력 예시
a1
출력 예시
2
아이디어
나이트가 이동할 수 있는 방향을 미리 정의해놓고, 입력 위치에 따른 이동 위치를 좌표 평면 위인지만 판단하면 된다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Chap4_3 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int col = s.charAt(0) - 'a' + 1;
int row = s.charAt(1) - '0';
int[][] steps = {
{-2, -1}, {-2, 1},
{-1, 2}, {1, 2},
{2, -1}, {2, 1},
{-1, -2}, {1, -2}
};
int count = 0;
for(int[] step : steps) {
int nx = col + step[0];
int ny = row + step[1];
if(nx >= 1 && ny >= 1 && nx <= 8 && ny <= 8)
count++;
}
System.out.println(count);
}
}