백준 1063 킹 - S3 구현

김민영·2023년 6월 14일
0

알고리즘

목록 보기
125/125

Python3

# 1063
# 돌과 같은 곳으로 이동할 때는 돌을 킹이 이동하는 방향으로 한 칸 이동.
# 킹이나 돌이 체스판 밖으로 나가는 경우는 건너뜀.
# 마지막 위치 출력 #

# 인덱스 범위 벗어났는지 체크 벗어나면 0
def indexCheck(x, y):
    if x < 0 or x >= 8 or y < 0 or y >= 8:
        return 0
    return 1


# 이동
def move(x, y, direction):

    # 위부터 시계방향
    dx = [0, 1, 1, 1, 0, -1, -1, -1]
    dy = [1, 1, 0, -1, -1, -1, 0, 1]
        
    if "T" == direction:
        idx = 0
    elif "RT" == direction:
        idx = 1
    elif "R" == direction:
        idx = 2
    elif "RB" == direction:
        idx = 3
    elif "B" == direction:
        idx = 4
    elif "LB" == direction:
        idx = 5
    elif "L" == direction:
        idx = 6
    elif "LT" == direction:
        idx = 7
    
    return (x + dx[idx], y + dy[idx])


# 숫자 좌표 -> 영어 좌표
def numToEn(x, y):

    x = chr(x + 65)
    y = str(y + 1)
    return x + y


# 영어좌표 -> 숫자좌표 (입력은 A1꼴, 리턴은 (0, 0)꼴)
def enToNum(en):
    x = en[0]
    y = int(en[1])

    x = ord(x) - 65
    y -= 1
    return (x, y)


def main():

    K, S, N = input().split()

    Kx, Ky = enToNum(K)
    Sx, Sy = enToNum(S)

    for _ in range(int(N)):
        direction = input()

        new_Kx, new_Ky = move(Kx, Ky, direction)
        new_Sx = Sx
        new_Sy = Sy

        # 위치 겹치는 경우 - S도 이동
        if new_Kx == Sx and new_Ky == Sy:
            new_Sx, new_Sy = move(Sx, Sy, direction)
            
        # 인덱스 벗어남 - 원복
        if 0 == indexCheck(new_Kx, new_Ky) or 0 == indexCheck(new_Sx, new_Sy):
            continue
        
        Kx = new_Kx
        Ky = new_Ky
        Sx = new_Sx
        Sy = new_Sy

    print(numToEn(Kx, Ky))
    print(numToEn(Sx, Sy))
    
main()

잡설

깉은 복사 얕은 복사 생각하기 귀찮고,
그냥 처음부터 Kx, Ky, Sx, Sy로 변수를 나눠서 생각할 걸 그랬다.

원래는 좌표를 (1, 2) 꼴로 받아서 처리하려했는데 얕은복사 때문에 잘 안됐었다.
시간 낭비만 함...

profile
노션에 1차 정리합니당 - https://cream-efraasia-f3c.notion.site/4fb02c0dc82e48358e67c61b7ce8ab36?v=

0개의 댓글