자바 이것이 코딩 테스트다 - chapter04 - 2 왕실의 나이트

 

 

문제

행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다. 나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다. 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다. 나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

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

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

예를 들어 만약 나이트가 a1에 있을 때 이동할 수 있는 경우의 수는 다음과 같은 2가지이다. a1의 위치는 좌표 평면에서 구석의 위치에 해당하며 나이트는 정원의 밖으로는 나갈 수 없기 때문이다.

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

또 다른 예로 나이트가 c2에 위치해 있다면 나이트가 이동할 수 있는 경우의 수는 6가지이다. 이건 직접 계산해보시오.

 

 

생각

1.L자로 움직일 수 있는 방법은 총 8가지이다. 해당 8가지의 경우 수에대한 x,y를 배열에 저장한다.

2. 좌표가 주어졌을때 계산하기 쉽게 a~h도 1~8로 변환하여 8가지 경우의 수에 대해 계산한다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;

public class Main{
    //4챕터구현 2번 왕실의 나이트
    public static void main(String[] args) throws IOException{
        BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
        String str = bf.readLine();
        int x = str.charAt(1)-'0'; //x,y로 변환
        int y = str.charAt(0)-'a'+1;
        int Ox = x;
        int Oy = y;
        int[] dx = {-2,-2,-1,1,-1,1,2,2};  //L자로 움직일 수 있는 x,y좌표 설정
        int[] dy = {-1,1,-2,-2,2,2,-1,1};
        int count=0;
        for(int i=0 ; i<8;i++) {
            Ox += dx[i];
            Oy += dy[i];
            if(Ox<1 || Ox>8 || Oy<1 || Oy >8 ) {  //정답예제는 밖으로 나가는처리가 아니라 안에들어오는처리 ex)Ox>=1와 같이.
                Ox =x;
                Oy =y;
                continue;
            }
            Ox =x;
            Oy =y;
            count ++;
        }
        System.out.println(count);
    }
}

 

+ Recent posts