문제
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='')'Algorithm > Simulation' 카테고리의 다른 글
| [Python] 백준 2615번 오목 (0) | 2023.05.25 |
|---|---|
| [Python] 백준 2504번 괄호의 값 (0) | 2023.05.25 |
| [Python] SWEA 13428번 숫자 조작 (0) | 2023.05.18 |
| [Python] SWEA 1228,1230번 암호문1, 암호문3 (0) | 2023.05.16 |
| [Python] SWEA 1216번 회문2 (0) | 2023.05.15 |