배씌 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);
    }
}