[PYTHON/파이썬] 1063 킹

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

문제풀이

  • 킹이 움직일 수 있는 키워드를 딕셔너리로 방향을 저장한다.
  • 킹의 위치와 돌의 위치를 인덱스 번호로 바꾼다.
  • 조건에 성립하면 위치를 이동한다.
    • 체스 범위 안에 위치해야하고
    • 킹의 이동할 위치가 돌의 위치면 돌은 킹의 방향만큼 이동한다.
      • 단, 돌이 체스 범위 안에 위치할때만
  • 조건이 성립하면 인덱스 번호를 다시 체스판에 맞게 출력한다.

soltuion1 - 시도/성공

delta = {
    'R':(1,0),
    'L':(-1,0),
    'B':(0,1),
    'T':(0,-1),
    'RT':(1,-1),
    'LT':(-1,-1),
    'RB':(1,1),
    'LB':(-1,1)
}
# 입력값을 행렬 인덱스로 바꿔주는 함수
def change_matrix_point(point):
    col = 'ABCDEFGH'
    x = col.index(point[0])
    y = 8 - int(point[1])
    return x,y

import sys
king,stone,n = sys.stdin.readline().strip().split()

k_x,k_y = change_matrix_point(king)
s_x,s_y = change_matrix_point(stone)


move_data = [sys.stdin.readline().strip() for _ in range(int(n))]
move_point = [delta[m] for m in move_data]


for m in range(int(n)):
    # 킹의 위치는 범위에 벗어나지 않으면 움직인다.
    if 0 <= k_x +  move_point[m][0] < 8 and 0<= k_y +  move_point[m][1] < 8:
        k_x += move_point[m][0]
        k_y += move_point[m][1]
    # 만약 움직인 킹의 위치와 돌의 위치가 같으면
    if k_x == s_x and k_y== s_y :
        # 돌의 위치가 킹의 위치때문에 움직인 위치가 범위에 벗어나지 않으면 움직이고
        if 0 <= s_x +  move_point[m][0] < 8 and 0<= s_y +  move_point[m][1] < 8:
            s_x += move_point[m][0]
            s_y += move_point[m][1]
        # 돌의 위치가 킹의 위치때문에 움직인 위치가 범위에 벗어나면 돌은 움직이지 않고 킹도 원래 위치로 돌아간다.
        else:
            k_x -= move_point[m][0]
            k_y -= move_point[m][1]


# 함수 인덱스를 체스판 숫자로 바꿔주는 함수
def change_chess_point(x,y):
    col = 'ABCDEFGH'
    c_x = col[x]
    c_y = str(8 - y)
    return c_x + c_y

print(change_chess_point(k_x,k_y))
print(change_chess_point(s_x,s_y))

보완할 점.

  • 알파벳을 아스키 코드로 변환하여 쓴다.
    • 현재 : 'A1'을 입력받으면 'ABCDEFGH'에서 'A'의 인덱스 번호를 구해 열의 값을 구하고 '1'은 8에서 빼 0에서 부터 시작하는 행의 값을 구한다.
    • 보완 : 아스키코드를 이용해 알파벳을 쉽게 인덱스 번호로 바꾸고 행은 그냥 입력받는다.(행의 시작을 1로)
      • => delta값 다시 설정해야 한다.
  • if조건문을 간단히 만들자.
    • 현재 : 이동한 다음 체스판에 벗어나면 다시 이동 전의 위치로 이동한다.
    • 보완 : 이동값을 저장하고 체스판에 벗어나지 않으면 현재 위치에 이동값을 더해 이동한다.
 

solution - 최종 코드/성공

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

import sys
king,stone,n = sys.stdin.readline().strip().split()

# 킹의 위치와 돌의 위치를 인덱스 번호로 바꿈
k_x,k_y = ord(king[0]) -64, int(king[1])
s_x,s_y  = ord(stone[0]) -64, int(stone[1])

move_data = [sys.stdin.readline().strip() for _ in range(int(n))]
move_point = [delta[m] for m in move_data]


for m in range(int(n)):
    # 킹은 입력받은 움직이는 값만큼 이동값을 가진다.(아직 움직이는거 아님) 
    move_k_x = k_x + move_point[m][0]
    move_k_y = k_y + move_point[m][1]
    # 킹의 위치가 체스 밖에 벗어나지 않고
    if 0 < move_k_x <= 8 and 0 < move_k_y <= 8:
        # 킹의 위치와 돌의 위치가 같고
        if move_k_x == s_x and move_k_y == s_y:
            # 돌의 위치는 킹이 움직이는 만큼 이동값을 가진다. (아직 킹의 위치도 같이 이동하는 것이 아님)
            move_s_x = s_x + move_point[m][0]
            move_s_y = s_y + move_point[m][1]
            # 만약 돌의 위치가 체스 밖에 벗어나지 않으면
            if 0 < move_s_x <= 8 and 0 < move_s_y <= 8:
                # 킹과 돌은 각자의 이동값만큼 움직인다.
                k_x, k_y = move_k_x, move_k_y
                s_x, s_y = move_s_x, move_s_y
        # 만약 킹이 이동할때 돌의 위치가 상관없으면 킹은 이동값만큼 움직인다.
        else:
            k_x, k_y = move_k_x, move_k_y


print(chr(k_x + 64), k_y, sep ='')
print(chr(s_x + 64), s_y, sep ='')

댓글