View

📚 문제

체스판과 같은 8 x 8 좌표 평면에서 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

 8 x 8 좌표 평면 상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오.  이때 행 위치는 1부터 8로 표현하며, 열 위치는 a부터 h로 표현한다.

 

예를 들어 만약 나이트가 a1에 있을 때 이동할 수 있는 경우의 수는 다음 2가지이다.

1. 오른쪽으로 두칸 이동 후 아래로 한 칸 이동하기( c2)

2. 아래로 두 칸 이동 후 오른쪽으로 한 칸 이동하기 (b3)

또 다른 예로 나이트가 c2에 위치해 있다면 나이트가 이동할 수 있는 경우의 수는 6가지이다.

 

📝 문제 해결

 dx,dy라는 별도의 리스트에 현재 위치를 기준으로 아래쪽과 오른쪽은 양수의 값을, 위쪽과 왼쪽은 음수의 값으로 이동경로 저장

-> 나이트의 현재 위치가 주어지면 현재 위치에 이동 경로를 더한 다음 8X8 좌표 평면에 있는지 확인

 

💻 코드

package implementation;

import java.util.Scanner;

public class impl_0516_4_3 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        String inputData = sc.nextLine();
        int row = inputData.charAt(1) - '0';        //'0'의 아스키코드는 48
        int col = inputData.charAt(0) - 'a' + 1;    //'a'의 아스키코드는 97

        int[] dx = {-2, -1, 1, 2, 2, 1 ,-1, -2};
        int[] dy = {-1, -2, -2, -1, 1 ,2 ,2, 1};

        int result = 0;

        for(int i = 0; i < 8; i++){
           int nx = row + dx[i];
           int ny = col + dy[i];

           if(nx >= 1 && nx <= 8 && ny >= 1 && ny <= 8) result += 1;
        }

        System.out.println(result);
    }
}
💡 chatAt(i)-'0' : 숫자형태의 String에서 int 변수로 변환
숫자 '1'의 아스키 코드 : 49
숫자 '0'의 아스키 코드 : 48
inputData.charAt(1) : inputData의 첫번째 문자를 가져옴
inputData.charAt(1) - '0' : inputData의 첫번째 문자열을 숫자로 변환
728x90
Share Link
reply
«   2025/02   »
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