본문 바로가기
알고리즘

[알고리즘/백준] 1063번 킹 Python 파이썬

by 배애앰이 좋아 2023. 2. 26.
반응형

 

해당 문제는 문제를 제대로 이해 못하고 엉뚱한 부분에서 막혀서 시간을 많이 소비했다ㅠㅠ 

 

 

해당 문제를 풀 때 주의해야하는 점은 

1. 돌이 킹이랑 매번 같이 움직이는 게 아닌 킹이 돌의 위치로 이동하게 되면 같이 이동해준다는 점

2. 만약에 움직였을 때 킹이 체스 판을 안나가고 돌만 나갈 경우 킹은 움직여줘야 한다는 점

이 두가지만 잘 이해해서 풀면된다.

 

그리고 막힌 에러 코드 부분은 

 

move = input()

x,y = move_pos(move)

 

에서 typeerror: cannot unpack non-iterable nonetype object 에러가 떴는데

 

move = list(map(str,input().split()))
x,y = move_pos(move[0])

 

으로 수정해서 에러를 고칠 수 있었다.

 

다음과 같은 코드를 통해 통과하였다.

 

import sys
input = sys.stdin.readline

KP, SP, N = map(str, input().split())

def now_position_to_int(c):
    if c[0] == 'A':
        return 0
    elif c[0] == 'B':
        return 1
    elif c[0] == 'C':
        return 2
    elif c[0] == 'D':
        return 3
    elif c[0] == 'E':
        return 4
    elif c[0] == 'F':
        return 5
    elif c[0] == 'G':
        return 6
    else:
        return 7

def now_position_to_chr(c):
    if c == 0:
        return 'A'
    elif c == 1:
        return 'B'
    elif c == 2:
        return 'C'
    elif c == 3:
        return 'D'
    elif c == 4:
        return 'E'
    elif c == 5:
        return 'F'
    elif c == 6:
        return 'G'
    else:
        return 'H'

def move_pos(m):
    if m == 'R':
        return 1, 0
    elif m == 'L':
        return -1, 0
    elif m == 'B':
        return 0, -1
    elif m == 'T':
        return 0, 1
    elif m == 'RT':
        return 1, 1
    elif m == 'LT':
        return -1, 1
    elif m == 'RB':
        return 1, -1
    elif m == 'LB':
        return -1, -1

kpx, kpy = now_position_to_int(KP), (int(KP[1])-1)
spx, spy = now_position_to_int(SP), (int(SP[1])-1)

for i in range(int(N)):
    move = list(map(str,input().split()))
    x,y = move_pos(move[0])
    ckpx, ckpy = kpx + int(x), kpy + int(y)
    if 0 <= ckpx < 8 and 0 <= ckpy < 8:
        if spx == ckpx and spy == ckpy:
            cspx, cspy = spx + int(x), spy + int(y)
            if 0 <= cspx < 8 and 0 <= cspy < 8:
                kpx, kpy = ckpx, ckpy
                spx, spy = cspx, cspy
        else:
            kpx, kpy = ckpx, ckpy

print(now_position_to_chr(kpx), end='')
print(kpy+1)
print(now_position_to_chr(spx), end='')
print(spy+1)

 

주요 코드는 길지 않지만 체스판 문자를 숫자로 / 숫자를 문자로 변환해주는 부분에서 코드 줄을 쓸데없이 많이 낭비하였는데 다른 분들은 딕셔너리를 사용해서 짧게 처리한 것을 보았다. 고로 딕셔너리 사용을 추천한다. 또한, 문제를 꼼꼼히 읽는 것은 언제나 중요한 것 같다.

 

반응형

댓글