Algorithm/Simulation

[Python] 백준 1063번 킹

코딩쪼앙 2023. 5. 24. 01:25

문제

 

1063번: 킹

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

www.acmicpc.net

입력

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

출력

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

입력 예제

A1 A2 5
B
L
LB
RB
LT

출력 예제

A1
A2

문제 풀이

  • 먼저 들어오는 킹과 돌의 위치를 형식에 맞게 파싱한다.
  • 그 후 돌이나 킹이 맵 밖으로 나가지 않는 경우만 움직인다.
    • 킹을 이동하려 할 때 맵 밖으로 나가면, 멈추고, 킹 이동을 마친 후, 돌을 이동할 때 돌이 맵 밖으로 나간다면, 킹의 이동 또한 취소한 후, 멈춰야 한다.
  • 이동을 마쳤다면, 형식에 맞게 각 좌표들을 출력한다.

코드

k,d,n = input().split()
n = int(n)
move_list = ['R', 'L' , 'B', 'T', 'RT', 'LT' , 'RB', 'LB']
go = [(0,1),(0,-1),(1,0),(-1,0),(-1,1),(-1,-1),(1,1),(1,-1)]
move = []

# 킹과 돌의 위치 파싱
ky = abs(int(k[1]) - 8)
dy = abs(int(d[1]) - 8)
kx = ord(k[0]) - ord('A')
dx = ord(d[0]) - ord('A')

# 행의 값은 abs(y - 8)
for _ in range(n):
    move.append(input())

for i in move:
    idx = move_list.index(i)
    my, mx = go[idx]
    # 킹이 맵 밖으로 나가거나, 돌이 체스판 밖으로 나갈 때 이동 멈춤
    if not (0 <= ky + my < 8 and 0 <= kx + mx < 8):
        continue
    ky += my
    kx += mx

    # 킹과 돌의 위치가 같을 때
    if ky == dy and kx == dx:
        # 돌이 맵 밖으로 넘어가면 킹의 위치도 초기화
        if not (0 <= dy + my < 8 and 0 <= dx + mx < 8):
            ky -= my
            kx -= mx
            continue
        dy += my
        dx += mx

print(chr(ord('A') + kx), abs(ky - 8),sep='')
print(chr(ord('A') + dx), abs(dy - 8),sep='')