min's devlog

[구현] 왕실의 나이트 본문

til/Algorithm

[구현] 왕실의 나이트

값진 2022. 7. 5. 22:43
  • 8 x 8 좌표 평면의 왕실 정원의 특정 한칸에 나이트가 서있다.
  • 나이트의 이동은 
  • 나이트의 위치가 주어졌을 때 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하세요. 행 위치는 1부터 8로, 열 위치는 a부터 h로 표현합니다.

 

  • 입력 조건 : 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열. 예) a1
  • 출력 조건 : 첫째줄에 나이트가 이동할 수 있는 경우의 수 출력

 

풀이 코드

 

import java.util.*;

public class Main {

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

        // 현재 나이트의 위치 입력받기
        String inputData = sc.nextLine();
        int row = inputData.charAt(1) - '0';
        int column = inputData.charAt(0) - 'a' + 1;

        // 나이트가 이동할 수 있는 8가지 방향 정의
        int[] dx = {-2, -1, 1, 2, 2, 1, -1, -2};
        int[] dy = {-1, -2, -2, -1, 1, 2, 2, 1};

        // 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
        int result = 0;
        for (int i = 0; i < 8; i++) {
            // 이동하고자 하는 위치 확인
            int nextRow = row + dx[i];
            int nextColumn = column + dy[i];
            // 해당 위치로 이동이 가능하다면(체스판을 벗어나지 않는다면) 카운트 증가
            if (nextRow >= 1 && nextRow <= 8 && nextColumn >= 1 && nextColumn <= 8) {
                result += 1;
            }
        }

        System.out.println(result);
    }

}

 

리스트를 이용해서, 이동할 수 있는 8가지 방향에 대한 방향 벡터를 정의한다. 그 후 나이트의 8가지 경로를 하나씩 확인하며 이동이 가능한지 확인한다. 

 

- 주의

        int row = inputData.charAt(1) - '0';
        int column = inputData.charAt(0) - 'a' + 1;

 

 

문자 하나하나는 char형으로, int로 형변환시 아스키코드 값이 된다. 문자 '0'은 int형으로 형변환시 48이고 'a'는 97, 'A'는 65이다.

나이트의 위치는 문자열의 형태로 입력 받은 상태로,  row와 coloum 은 아스키 코드 값을 빼주며 초기화한다.

특히 알파벳 아스키코드 값은 0부터 시작하는 숫자와는 다르게, a부터 시작하기 때문에 'a' 값을 빼준 후 1을 더해야한다.

 

 

문제 출처 : 나동빈님의 이것이 취업을 위한 코딩 테스트다

'til > Algorithm' 카테고리의 다른 글

[완전 탐색] 시각 문제  (0) 2022.07.05
5x5 마방진  (0) 2022.04.07
회장 선거  (0) 2021.07.31
[Two pointers] 연속된 자연수의 합  (0) 2021.07.30
연속부분수열  (0) 2021.07.30
Comments