Silver 3
X
X
첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직여야 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 쓰여 있는 8가지 중 하나이다.
첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다.
C1 B1 3
L
T
LB
B2
A1
여러가지 경우의 수를 고려하여 잘 구현하면 되는 문제이다.
k,s,n=input().split()
n=int(n)
case=[input() for _ in range(n)]
#방향벡터 설정
move=['R','L','B','T','RT','LT','RB','LB']
dr=[0,0,-1,1,1,1,-1,-1]
dc=[1,-1,0,0,1,-1,1,-1]
king=[]
stone=[]
#킹과 돌의 위치를 숫자 인덱스 좌표로 변경
for x in k:
if x.isalpha():
king.append(ord(x)-65)
continue
king.append(int(x)-1)
for x in s:
if x.isalpha():
stone.append(ord(x)-65)
continue
stone.append(int(x)-1)
#row와 col에 순서에 맞게 스왑
king[0],king[1]=king[1],king[0]
stone[0],stone[1]=stone[1],stone[0]
for cs in case:
for x in range(len(move)):
#킹의 현재위치 (이동용)
nr=king[0]
nc=king[1]
#돌의 현재위치 (이동용)
nrs=stone[0]
ncs=stone[1]
#킹의 현재위치 (되돌리기용)
nrh=king[0]
nch=king[1]
#방향이동
if cs == move[x]:
nr+=dr[x]
nc+=dc[x]
if nr<0 or nr>7 or nc<0 or nc>7:
continue
king[0]=nr
king[1]=nc
if king[0]==stone[0] and king[1]==stone[1]:
nrs+=dr[x]
ncs+=dc[x]
if nrs<0 or nrs>7 or ncs<0 or ncs>7:
king[0]=nrh
king[1]=nch
continue
stone[0]=nrs
stone[1]=ncs
#정답으로 변환
k=''
s=''
k+=chr(king[1]+65)
k+=str(king[0]+1)
s+=chr(stone[1]+65)
s+=str(stone[0]+1)
print(k)
print(s)
주어진 정보를 리스트에 담고 조건들을 잘 구현하면 된다.
34:12
실버 3이라서 A4에 쓰지 않고 대충 풀었다가 방향벡터를 설정하는 과정에서 방향을 제대로 설정하지 않아서 시간을 많이 허비했다.
처음에는 딕셔너리를 사용하려 했고 다른 사람의 풀이를 보니 딕셔너리가 정석인 것 같지만, 문제 풀 때 자주 사용하게 될 방향벡터를 사용해서 풀어보았다.
구현 문제에서는 실수하지 않게 중간 중간 디버깅을 꼭 해주자