본문으로 바로가기

[백준] 1063번 : 킹

category 알고리즘/백준 2022. 2. 2. 10:45
728x90

 

문제

 

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. 예를 들어, 왼쪽 아래 코너는 A1이고, 그 오른쪽 칸은 B1이다.

킹은 다음과 같이 움직일 수 있다.

  • R : 한 칸 오른쪽으로
  • L : 한 칸 왼쪽으로
  • B : 한 칸 아래로
  • T : 한 칸 위로
  • RT : 오른쪽 위 대각선으로
  • LT : 왼쪽 위 대각선으로
  • RB : 오른쪽 아래 대각선으로
  • LB : 왼쪽 아래 대각선으로

체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다. 아래 그림을 참고하자.

입력으로 킹이 어떻게 움직여야 하는지 주어진다. 입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.

킹과 돌의 마지막 위치를 구하는 프로그램을 작성하시오.

 

입력

 

첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직여야 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 쓰여 있는 8가지 중 하나이다.

 

출력

 

첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다.

 

 

풀이 방법

 

킹이 움직일 수 있는 경우의 수를 담은 함수를 만들고 이 함수의 이동으로 인해 오른쪽 범위 A~H, 왼쪽 범위 1~8에

있는지 확인하는 과정이 필요하다.

 

또한, 좌표로 주어지는 값은 문자 하나와 숫자형 하나이므로 이를 char형 배열에 저장하여도 무관하다.

먼저, 이 좌표가 움직일 수 있는 함수를 switch~case문을 이용하여 표현하였고, 이 범위에 포함되는지 확인하는 함수를 통해 벗어날 경우 false를 출력할 수 있도록 하였다.

 

킹과 돌은 주어진 좌표에 따라 계속하여 움직이므로 기존에 받았던 값을 clone하여 반복문에 입력시켜 주었으며, 주어진 조건에서 돌이 킹과 같을 때는 돌을 같은 방식으로 움직여야 하므로 Arrays.equals()인지 비교하는 문을 구현하였다.

 

작성 코드

 

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package baekjoon.Implementation;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class BJ_1063 {
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        char[] king = st.nextToken().toCharArray();
        char[] stone = st.nextToken().toCharArray();
        int N = Integer.parseInt(st.nextToken());
 
        for (int i = 0; i < N; i++) {
            String line = br.readLine();
            char[] k_pos=king.clone();
            char[] s_pos=stone.clone();
            move(line, k_pos);
            if (range(k_pos))
                continue;
            if(Arrays.equals(k_pos,s_pos)){
                move(line, s_pos);
                if (range(s_pos))
                    continue;
            }
            king=k_pos;
            stone=s_pos;
        }
 
        System.out.println(king);
        System.out.println(stone);
    }
 
    public static boolean range(char[] next){
        return (next[0]<'A' || next[0]>'H' || next[1]<'1' || next[1]>'8');
    }
 
    public static void move(String pos, char[] next){
 
        switch (pos){
            case "R": next[0]++break;
            case "L": next[0]--break;
            case "B": next[1]--break;
            case "T": next[1]++break;
            case "RT": next[0]++; next[1]++break;
            case "LT": next[0]--; next[1]++break;
            case "RB": next[0]++; next[1]--break;
            case "LB": next[0]--; next[1]--break;
        }
    }
}
 
 
 

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 14500번 : 테트로미노  (0) 2022.02.02
[백준] 2563번 : 색종이  (0) 2022.02.02
[백준] 2980번 : 도로와 신호등  (0) 2022.02.02
[백준] 3048번 : 개미  (0) 2022.02.02
[백준] 16943번 : 숫자 재배치  (0) 2022.01.28