[백준] 1063번 킹 . python

sun1·2023년 3월 5일
0

im_test

목록 보기
18/22
post-thumbnail

문제

' 1063번 킹'
https://www.acmicpc.net/problem/1063

풀이

조건

  • 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다.
  • 체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다.
  • 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.

풀이 순서

  • 킹의 위치, 돌의 위치, 움직이는 횟수 N을 입력값으로 받는다.
  • 의 위치가 알파벳이기 때문에 이를 숫자로 바꾸도록 리스트의 인덱스를 이용한다.
  • 움직일 방향이 알파벳이기 때문에 이를 숫자로 바꾸기 위해 딕셔너리를 이용한다.
  • 이동이 가능한지 확인하는 함수를 만들어 돌과 킹이 8 x 8 배열안에서만 움직일 수 있도록 한다.
  • 출력값은 알파벳과 숫자의 조합이므로 모두 문자열로 전환해서 하나의 문자열로 출력할 수 있도록 한다.

코드

Python

def check(y, x):  # 이동할 수 있는지 확인하고 이동할 수 있다면 이동하는 함수
    global kx, ky, sx, sy
    nx_k = kx + x  # 다음 이동할 킹의 좌표
    ny_k = ky + y
    if nx_k < 0 or ny_k < 0 or nx_k >= 8 or ny_k >= 8:  # 킹이 범위를 벗어나면 그만두기
        return
    else:
        if nx_k == sx and ny_k == sy:  # 킹이 범위내에 있고 다음 이동경로에 돌이 있다면
            nx_s = sx + x  # 다음 이동할 동의 좌표
            ny_s = sy + y
            if nx_s < 0 or ny_s < 0 or nx_s >= 8 or ny_s >= 8:  # 돌이 범위를 벗어나면 그만두기
                return
            else:  # 킹도 돌도 범위안이라면 둘다 움직이기
                kx = nx_k
                ky = ny_k
                sx = nx_s
                sy = ny_s
        else:  # 킹이 이동할 다음 경로가 돌이 있는 좌표가 아니라면 킹만 움직이기
            kx = nx_k
            ky = ny_k

lst_x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']  # x좌표의 문자를 인덱스 숫자로 바꾸기 위해 리스트 생성
dic = {'R': [0, 1], 'L': [0, -1], 'B': [-1, 0], 'T': [1, 0], 'RT': [1, 1], 'LT': [1, -1], 'RB': [-1, 1],
       'LB': [-1, -1]}  # 이동방향 설정
k, s, N = input().split()
kx = lst_x.index(k[0])  # 문자 x좌표를 숫자 인덱스로 전환
ky = int(k[1]) - 1  # y좌표: 1부터 시작하나 x좌표 인덱스가 0부터 시작하므로 같이 맞춰주기 위해 -1
sx = lst_x.index(s[0])
sy = int(s[1]) - 1
for i in range(int(N)):
    n = input()
    [y, x] = dic[n]  # 입력값이 의미하는 이동경로를 숫자로 전환
    check(y, x)
K = [lst_x[kx], str(ky + 1)]  # 최종 킹의 좌표값 리스트
S = [lst_x[sx], str(sy + 1)]  # 최종 돌의 좌표값 리스트
print(''.join(K))  # 최종 킹의 문자 좌표 출력
print(''.join(S))  # 최종 돌의 문자 좌표 출력

다른 방법

  • 아스키 코드를 이용해서 한번에 바꾸는 방법
def toPos(st):
    return int(st[1]), ord(st[0])-ord('A')+1

def toAB(i,j):
    return chr((j-1)+ord('A'))+str(i)

K, S, N = input().split()
# 킹, 돌의 위치를 좌표로 변환
ci, cj = toPos(K)
si, sj = toPos(S)
N = int(N)
dct = {'R':(0,1), 'L':(0,-1),'B':(-1,0),'T':(1,0),'RT':(1,1),'LT':(1,-1),'RB':(-1,1),'LB':(-1,-1)}
for _ in range(N):
    di,dj = dct[input()]
    ni,nj = ci+di, cj+dj
    if 1<=ni<=8 and 1<=nj<=8:           # 범위내
        if (ni,nj)==(si,sj):            # 이동할 위치에 돌이 있는 경우
            ei,ej = si+di, sj+dj        # 돌의 이동할 위치
            if 1<=ei<=8 and 1<=ej<=8:   # 돌 이동가능
                si,sj = ei,ej
                ci,cj = ni,nj
        else:
            ci, cj = ni, nj

print(toAB(ci,cj), toAB(si,sj), sep='\n')

0개의 댓글