본문 바로가기

Problem Solving/boj

[BOJ] 1063. 킹(Python) / Simulation

www.acmicpc.net/problem/1063

 

1063번: 킹

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

www.acmicpc.net

무난한 수준의 시뮬레이션 문제였다.

  • King의 위치와 Stone의 위치를 입력받은 정보대로 움직이며 최종 위치를 출력한다.
  • 이동 정보는 파이썬 Dictionary 자료구조를 활용해 이동할 곳을 Masking해주었다.
  • Input 받을 때 좌표를 다루기 쉬운 숫자 형태로 변환하는 것과 이동 처리 후 Output할 때 다시 문자 형태로 변환하는 것이 꽤 까다로웠다.
    • 이 때, 파이썬의 ord() 함수와, chr() 함수를 사용해 변환해주었다.
  • 이동할 때, King과 Stone 모두 격자 밖으로 나가면 무효로 쳐야한다.
    • 특히, Stone이 격자 밖으로 나가면 King의 움직임 역시 이전 상태로 되돌리는(무효) 처리를 해줘야 pass를 받을 수 있다.

 

파이썬 코드는 다음과 같다.


import sys
input = sys.stdin.readline

info = {
    "R": (0, 1),
    "L": (0, -1),
    "B": (1, 0),
    "T": (-1, 0),
    "RT": (-1, 1),
    "LT": (-1, -1),
    "RB": (1, 1),
    "LB": (1, -1)
}

king, stone, n = input().split()
kr, kc = 8-int(king[1]), ord(king[0])-ord("A")
sr, sc = 8-int(stone[1]), ord(stone[0])-ord("A")
for _ in range(int(n)):
    cmd = input().strip()
    dr, dc = info[cmd]
    if not (0 <= kr+dr < 8 and 0 <= kc+dc < 8):
        continue
    kr += dr
    kc += dc
    if (kr, kc) == (sr, sc):
        if not (0 <= sr+dr < 8 and 0 <= sc+dc < 8):
        	# 킹의 움직임 되돌리기
            kr -= dr
            kc -= dc
            continue
        sr += dr
        sc += dc
       
print(chr(ord("A")+kc)+str(8-kr))
print(chr(ord("A")+sc)+str(8-sr))

시간 : 128ms / 메모리 : 121220KB

고찰 : 어렵지 않은 시뮬레이션 문제이나 상세 조건을 잘 읽어서 처리하는 것이 꽤 까다로웠다. 재밌는 문제였다.