새소식

PS/백준

[백준/1063] 킹 (Python)

  • -

Problem : 

 

Difficulty : Silver 3

 

Status : Solved

 

Time : 00:18:49

 


 

문제 설명

 

더보기

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. 예를 들어, 왼쪽 아래 코너는 A1이고, 그 오른쪽 칸은 B1이다.

킹은 다음과 같이 움직일 수 있다.

 

  • R : 한 칸 오른쪽으로
  • L : 한 칸 왼쪽으로
  • B : 한 칸 아래로
  • T : 한 칸 위로
  • RT : 오른쪽 위 대각선으로
  • LT : 왼쪽 위 대각선으로
  • RB : 오른쪽 아래 대각선으로
  • LB : 왼쪽 아래 대각선으로

체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다. 아래 그림을 참고하자.

입력으로 킹이 어떻게 움직여야 하는지 주어진다. 입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.

킹과 돌의 마지막 위치를 구하는 프로그램을 작성하시오.

 

 

입력 및 출력

 

더보기

입력

첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직여야 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 쓰여 있는 8가지 중 하나이다.

 

출력

첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다.

 

입력 예시

A1 A2 5
B
L
LB
RB
LT

 

출력 예시

A1
A2

 


 

풀이

 

다음 두 가지만 유념하면 될 것 같다.

  • 1. 좌표계로의 변환. A1 ~ G8 범위의 좌표를 0~7까지의 값을 가지는 x 및 y좌표로 올바르게 바꾸고, 총 8개의 이동경로를 어떻게 좌표계에 변환시킬지 여부도 정확히 구현하면 된다.
  • 2. 이동 규칙. 
    • 킹이 먼저 임시로 이동한다.
    • 만약 돌이 임시 이동 경로와 일치한다면 돌 역시 임시로 이동한다.
    • 킹과 돌이 유효한 좌표에 있는지 검사하고 만약 유효좌표라면 이동결과를 반환한다.

 

이거빼고는 구현에 가까워서 시간을 잡아먹는 문제였던 것 같다.

 

 

풀이 코드

import sys

input = sys.stdin.readline
move_dict = {
  '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 decode_coord(x) :
  if '1' <= x <= '8' :
    return ord(x) - ord('1')
  else :
    return ord(x) - ord('A')

def encode_coord(x, y) :
  return chr(ord('A') + x) + str(y + 1)
  

def init() :
  global sx, sy, kx, ky, N
  king, stone, N = input().split()
  N = int(N)
  kx, ky = map(decode_coord, list(king))
  sx, sy = map(decode_coord, list(stone))

def move_once(mv) :
  global kx, ky, sx, sy
  mv_tuple = move_dict[mv]
  tkx, tky = kx + mv_tuple[0], ky + mv_tuple[1]
  if tkx < 0 or tkx > 7 or tky < 0 or tky > 7 :
    return

  if (tkx, tky) == (sx, sy) :
    tsx, tsy = sx + mv_tuple[0], sy + mv_tuple[1]
    if tsx < 0 or tsx > 7 or tsy < 0 or tsy > 7 :
      return
    sx, sy = tsx, tsy
  kx, ky = tkx, tky

def full_move() :
  for _ in range(N) :
    mv = input().strip()
    move_once(mv)

  print(encode_coord(kx, ky))
  print(encode_coord(sx, sy))

def solve() :
  init()
  full_move()

solve()

풀이 완료~

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.