' 1063번 킹'
https://www.acmicpc.net/problem/1063
A
이고, 가장 오른쪽 열이 H
까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다.같은 방향
으로 한 칸 이동시킨다.건너 뛰고
다음 이동을 한다.열
의 위치가 알파벳이기 때문에 이를 숫자로 바꾸도록 리스트의 인덱스
를 이용한다.움직일 방향
이 알파벳이기 때문에 이를 숫자로 바꾸기 위해 딕셔너리
를 이용한다.8 x 8
배열안에서만 움직일 수 있도록 한다.문자열
로 전환해서 하나의 문자열로 출력할 수 있도록 한다.def check(y, x): # 이동할 수 있는지 확인하고 이동할 수 있다면 이동하는 함수
global kx, ky, sx, sy
nx_k = kx + x # 다음 이동할 킹의 좌표
ny_k = ky + y
if nx_k < 0 or ny_k < 0 or nx_k >= 8 or ny_k >= 8: # 킹이 범위를 벗어나면 그만두기
return
else:
if nx_k == sx and ny_k == sy: # 킹이 범위내에 있고 다음 이동경로에 돌이 있다면
nx_s = sx + x # 다음 이동할 동의 좌표
ny_s = sy + y
if nx_s < 0 or ny_s < 0 or nx_s >= 8 or ny_s >= 8: # 돌이 범위를 벗어나면 그만두기
return
else: # 킹도 돌도 범위안이라면 둘다 움직이기
kx = nx_k
ky = ny_k
sx = nx_s
sy = ny_s
else: # 킹이 이동할 다음 경로가 돌이 있는 좌표가 아니라면 킹만 움직이기
kx = nx_k
ky = ny_k
lst_x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] # x좌표의 문자를 인덱스 숫자로 바꾸기 위해 리스트 생성
dic = {'R': [0, 1], 'L': [0, -1], 'B': [-1, 0], 'T': [1, 0], 'RT': [1, 1], 'LT': [1, -1], 'RB': [-1, 1],
'LB': [-1, -1]} # 이동방향 설정
k, s, N = input().split()
kx = lst_x.index(k[0]) # 문자 x좌표를 숫자 인덱스로 전환
ky = int(k[1]) - 1 # y좌표: 1부터 시작하나 x좌표 인덱스가 0부터 시작하므로 같이 맞춰주기 위해 -1
sx = lst_x.index(s[0])
sy = int(s[1]) - 1
for i in range(int(N)):
n = input()
[y, x] = dic[n] # 입력값이 의미하는 이동경로를 숫자로 전환
check(y, x)
K = [lst_x[kx], str(ky + 1)] # 최종 킹의 좌표값 리스트
S = [lst_x[sx], str(sy + 1)] # 최종 돌의 좌표값 리스트
print(''.join(K)) # 최종 킹의 문자 좌표 출력
print(''.join(S)) # 최종 돌의 문자 좌표 출력
def toPos(st):
return int(st[1]), ord(st[0])-ord('A')+1
def toAB(i,j):
return chr((j-1)+ord('A'))+str(i)
K, S, N = input().split()
# 킹, 돌의 위치를 좌표로 변환
ci, cj = toPos(K)
si, sj = toPos(S)
N = int(N)
dct = {'R':(0,1), 'L':(0,-1),'B':(-1,0),'T':(1,0),'RT':(1,1),'LT':(1,-1),'RB':(-1,1),'LB':(-1,-1)}
for _ in range(N):
di,dj = dct[input()]
ni,nj = ci+di, cj+dj
if 1<=ni<=8 and 1<=nj<=8: # 범위내
if (ni,nj)==(si,sj): # 이동할 위치에 돌이 있는 경우
ei,ej = si+di, sj+dj # 돌의 이동할 위치
if 1<=ei<=8 and 1<=ej<=8: # 돌 이동가능
si,sj = ei,ej
ci,cj = ni,nj
else:
ci, cj = ni, nj
print(toAB(ci,cj), toAB(si,sj), sep='\n')