1. 문제 설명
1063번: 킹
8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 �
www.acmicpc.net
문제
8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. 예를 들어, 왼쪽 아래 코너는 A1이고, 그 오른쪽 칸은 B1이다.
킹은 다음과 같이 움직일 수 있다.
- R : 한 칸 오른쪽으로
- L : 한 칸 왼쪽으로
- B : 한 칸 아래로
- T : 한 칸 위로
- RT : 오른쪽 위 대각선으로
- LT : 왼쪽 위 대각선으로
- RB : 오른쪽 아래 대각선으로
- LB : 왼쪽 아래 대각선으로
체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다. 아래 그림을 참고하자.

입력으로 킹이 어떻게 움직여야 하는지 주어진다. 입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.
킹과 돌의 마지막 위치를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직어여 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 쓰여 있는 8가지 중 하나이다.
출력
첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다.

핵심은
1. 돌의 위치와 킹의 위치가 범위 밖을 벗어나게 하는 명령어는 적용하지 않는다.
2. 주어지는 명령어는 킹에게만 적용이 되며, 킹과 돌이 부딪힐때 !
돌에게도 해당 명령어가 적용된다
** 2번을 제대로 이해하지 못해서 완전 뻘짓했다 ;;
" 체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다."
가 2번 을 의미하는 것임..
2. 풀이
# 초기 정보들 입력
king, doll, n = input().split()
n = int(n)
r = 8
# 행 정보를 숫자로 변환시키 위해 딕셔너리
col_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
col_dict = dict(zip(col_list, list(range(len(col_list)))))
# 콘솔 입력에 따라 이동 값 주는 딕셔너
console_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)}
# first point
kloc = (col_dict[king[0]], int(king[1]) - 1)
dloc = (col_dict[doll[0]], int(doll[1]) - 1)
# 키 값이 입력되면 그에따라 움직이는 함수
def move_key(kloc, dloc, one_key):
dx, dy = console_dict[one_key]
up_kloc_x, up_kloc_y = kloc[0] + dx, kloc[1] + dy
up_dloc_x, up_dloc_y = dloc[0], dloc[1]
# 돌의 위치가 킹의 위치와 같은 경우만 움직임 !
if (up_kloc_x, up_kloc_y) == dloc:
up_dloc_x, up_dloc_y = dloc[0] + dx, dloc[1] + dy
# 이동범위 안에 속하면 업데이트, 아니면 원래 값 그대로 반환
if 0 <= up_kloc_x < 8 and 0 <= up_kloc_y < 8 and 0 <= up_dloc_x < 8 and 0 <= up_dloc_y < 8:
kloc = (up_kloc_x, up_kloc_y)
dloc = (up_dloc_x, up_dloc_y)
return kloc, dloc
# 키값들 입력 받고 움직인 뒤 위치 업데이트
for one_key in range(n):
one_key = input()
kloc, dloc = move_key(kloc, dloc, one_key)
# change to num
print(col_list[kloc[0]] + str(kloc[1] + 1))
print(col_list[dloc[0]] + str(dloc[1] + 1))
* 알파벳을 다 숫자 인덱스로 바꾸어 연산했다.
* 각 명령어도 튜플 형태의 이동 값으로 변환하여 계산해다 - 그것이 계산하기 훨씬 편함
* 마지막에 바뀐 결과 값을 다시 알파벳으로 바꿔주었다.
3. 정리
코드 구현이 복잡할 뿐, 어려운 문제는 절대 아니다
특정 알고리즘을 써야할거라 생각했지만, 그저 코드를 구현하는 문제였을 뿐
저렇게 이동하는 키를 잘 쓸줄 아냐 못쓰냐가 풀이의 관건인 거 같다.
하지만 문제 이해 못해서.. 시간 너무 많이 써버림... 문제를 제대로 읽자...
'Study > Algorithm & Data structure' 카테고리의 다른 글
[프로그래머스][greedy] 조이스틱 (201020) (0) | 2020.10.20 |
---|---|
[프로그래머스][greedy] 구명보트 (201019) (0) | 2020.10.19 |
[프로그래머스][greedy] 최소스패닝트리 (크루스칼)(201016) (0) | 2020.10.17 |
[프로그래머스][greedy] 섬연결하기(201015) (0) | 2020.10.15 |
[프로그래머스][greedy] 단속카메라(201014) (0) | 2020.10.14 |
댓글