본문 바로가기
알고리즘 풀이/백준

[백준 1063] 킹 (python)

by char_lie 2023. 3. 9.
반응형

https://www.acmicpc.net/problem/1063

 

1063번: 킹

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

www.acmicpc.net

킹 문제

입력받은 킹과 돌의 위치를 조건에 맞게 이동하여 킹과 돌의 최종 위치를 구하는 문제

입력 조건에 따른 위치를 반복하여 계산해 나가면 구현 할 수 있었음

내가 푼 정답코드

import sys
king, stone, N = sys.stdin.readline().split()
#킹의 이동 방향
move = {'R':(0,1), 'L':(0,-1), 'B':(1,0), 'T':(-1,0), 'RT':(-1,1), 'LT':(-1,-1), 'RB':(1,1), 'LB':(1,-1)}
chess = ['A', 'B' ,'C', 'D', 'E', 'F', 'G', 'H'] # 가로 위치
k1, k2 = (8-(int(king[1])),chess.index(king[0])) # 킹의 열, 행
s1, s2 = (8-(int(stone[1])),chess.index(stone[0])) # 돌의 열, 행
for _ in range(int(N)):
    a, b = move[sys.stdin.readline().strip()]
    if 0 <= k1+a < 8 and 0 <= k2+b < 8: # 킹이 범위 밖을 벗어나지 않으면
        k1, k2 = k1 + a, k2 + b # 킹 이동해보고
        if k1 == s1 and k2 == s2: #그 때 돌과 킹의 위치가 같아지면
            s1, s2 = s1 + a, s2 + b # 돌도 킹과 같은 방향으로 이동
    if s1 <0 or s1 >= 8 or s2 <0 or s2 >= 8: # 만약 돌을 옮겨서 범위를 벗어나면
        k1, k2 = k1 -a, k2 - b # 킹 원위치
        s1, s2 = s1 -a, s2 - b # 돌도 원위치
print(chess[k2], 8-k1,sep='')
print(chess[s2], 8-s1,sep='')

조건에 따른 R,L,B,T 등을 딕셔너리로 받아주고, chess의 행이 알파벳으로 주어졌으므로, 이걸 숫자로 변환할 chess를 리스트로 만들어 주었다.

주의해야할게 체스판의 경우 왼쪽 아래서부터 A1~H8까지 오른쪽위로 올라가는 식의 숫자 구조이다.

그렇기에 킹과 돌의 열을 8부터 빼서 계산하여 인덱스를 만들어주고, 킹과 돌의 행을 chess에 맞는 인덱스 값으로 변환하여 주었다.

이후 주어진 조건에 맞도록 코드를 작성하여 구현할 수 있었다.


느낀 점

코드를 구현하면서 처음에 인덱스 숫자를 헷갈려서 구현하는데 오래걸렸다. 문제에 주어진 조건을 파악을 제대로 하지않아서 실수가 계속 반복하였고, 생각보다 오랜시간이 걸렸다.

문제를 제대로 읽고 조건을 파악하는 습관을 더 길러야겠다.

반응형

댓글