티스토리 뷰

728x90

https://www.acmicpc.net/problem/1063

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는

www.acmicpc.net


  • 문제 : 

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

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

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

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

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

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

 

 

 


  • 풀이 :

구현 문제이다. 처음에는 BFS 문제인 줄 알았는데 좌푯값만 이동하면 돼서 단순히 문제에서 요구하는 사항을 구현하면 되는 문제였다.

K, S, N에 왕, 돌, 명령의 수를 입력받고 각 명령에 대한 X, Y축의 좌푯값 변화를 dictionary로 만들어두었다.

이후 K와 S에서 시작하여 각 명령마다 주어진 이동을 수행하였는데 이 때, 좌표의 범위가 0보다 작거나 8과 같거나 크다면 명령을 수행하지 않도록 구현하였다.

또한 생각 외로 까다로웠던 부분이 A1과 같은 좌표를 (7, 0) 으로 변환하는 과정이었다.

 A,B,C,D ---- 는 0,1,2,3,---과 대칭되어 아스키값에서 65를 뺀 값을 넣어주면 되었지만

열의 좌표는 위에서부터 0인데 문제에서는 아래에서부터 1이므로 이를 변환하기 위해 (체스판의 높이 - 주어진 숫자)로 계산하였다. 

 

 

 

 


  • 소스코드 : 

 

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
K,S,N = input().split()
move = {
    "R" : [0,1],
    "L" : [0,-1],
    "B": [10],
    "T": [-10],
    "RT": [-11],
    "LT": [-1-1],
    "RB": [11],
    "LB": [1-1]
}
query = []
for _ in range(int(N)):
    query.append(input())
= [8-int(K[1]),ord(K[0])-ord("A")]
= [8-int(S[1]),ord(S[0])-ord("A")]
for i in query:
    if 0<=K[0]+move[i][0]<8 and 0<=K[1]+move[i][1]<8:
        K[0+= move[i][0]
        K[1+= move[i][1]
        if K == S:
            if 0 <= S[0+ move[i][0< 8 and 0 <= S[1+ move[i][1< 8:
                S[0+= move[i][0]
                S[1+= move[i][1]
            else:
                K[0-= move[i][0]
                K[1-= move[i][1]
print(chr(K[1]+65)+str(8-K[0]))
print(chr(S[1]+65)+str(8-S[0]))
cs
320x100
댓글
© 2022 WonSeok, All rights reserved