코딩 테스트 대비 알고리즘 문제 풀이.
https://www.acmicpc.net/problem/1063
8x8 크기의 체스판에 왕의 위치, 돌의 위치, 왕이 이동할 횟수 N과 방향이 주어지고 N번 이동한 이후의 왕의 위치와 돌의 위치를 출력하는 구현 문제.
왕이 이동하는 방향은 총 8개이고 왕이 이동하는 위치에 돌이 있으면 왕이 이동한 방향과 동일하게 돌도 이동시켜준다.
왕은 다음과 같이 움직일 수 있다.
- R : 한 칸 오른쪽으로
- L : 한 칸 왼쪽으로
- B : 한 칸 아래로
- T : 한 칸 위로
- RT : 오른쪽 위 대각선으로
- LT : 왼쪽 위 대각선으로
- RB : 오른쪽 아래 대각선으로
- LB : 왼쪽 아래 대각선으로
import sys
input = sys.stdin.readline
king, rock, n = input().split()
king_x = int(ord(king[0]) - 64)
king_y = int(king[1])
rock_x = int(ord(rock[0]) - 64)
rock_y = int(rock[1])
move = {'R':[1,0], 'L':[-1,0], 'B':[0,-1], 'T':[0,1], 'RT':[1,1], 'LT':[-1,1], 'RB':[1,-1], 'LB':[-1,-1]}
for i in range(int(n)):
dir = input().rstrip()
kx = king_x + move[dir][0]
ky = king_y + move[dir][1]
if 0<kx<9 and 0<ky<9:
if kx == rock_x and ky == rock_y:
rx = rock_x + move[dir][0]
ry = rock_y + move[dir][1]
if 0<rx<9 and 0<ry<9:
king_x, king_y = kx, ky
rock_x, rock_y = rx, ry
else:
king_x, king_y = kx, ky
else:
continue
print(chr(king_x+64) + str(king_y))
print(chr(rock_x+64) + str(rock_y))
< 코드 해설 >
왕과 돌이 입력받는 위치는 A2 B5와 같이 문자와 숫자의 조합이기에 문자들은 ord를 활용해 숫자로 변환한 후 X로 위치를 저장하고 y는 숫자 그대로 저장해준다.
move 변수로 이동할 수 있는 방향들을 딕셔너리 형태로 저장한다.
n번 이동하는 동안 왕과 돌이 주어진 범위 내에서만 이동할 수 있도록 구현해준다.
이 문제의 핵심은 기존과 다른 그래프 중심의 위치이므로 상하좌우 이동 시 방향을 지정해줘야 한다.
최종적으로 chr로 숫자를 문자로 변환하여 왕, 돌의 위치를 출력한다.