Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- algorithm
- javascript
- floyd washall
- 출처:장기효vue.js
- 백준
- implementaion
- 1012
- simulation
- Vue.js
- DFS
- Python
- 코테
- greedy
- programming
Archives
- Today
- Total
DevDave
[Algorithm]백준1063<python>(sil3)simulation 본문
킹 성공
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 | 128 MB | 9159 | 3092 | 2605 | 35.231% |
문제
8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. 예를 들어, 왼쪽 아래 코너는 A1이고, 그 오른쪽 칸은 B1이다.
킹은 다음과 같이 움직일 수 있다.
- R : 한 칸 오른쪽으로
- L : 한 칸 왼쪽으로
- B : 한 칸 아래로
- T : 한 칸 위로
- RT : 오른쪽 위 대각선으로
- LT : 왼쪽 위 대각선으로
- RB : 오른쪽 아래 대각선으로
- LB : 왼쪽 아래 대각선으로
체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다. 아래 그림을 참고하자.

입력으로 킹이 어떻게 움직여야 하는지 주어진다. 입력으로 주어진 대로 움직여서 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.
킹과 돌의 마지막 위치를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직여야 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 쓰여 있는 8가지 중 하나이다.
출력
첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다.
예제 입력 1 복사
A1 A2 5
B
L
LB
RB
LT
예제 출력 1 복사
A1
A2
예제 입력 2 복사
A1 H8 1
T
예제 출력 2 복사
A2
H8
예제 입력 3 복사
A1 A2 1
T
예제 출력 3 복사
A2
A3
예제 입력 4 복사
A1 A2 2
T
R
예제 출력 4 복사
B2
A3
예제 입력 5 복사
A8 B7 18
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
RB
예제 출력 5 복사
G2
H1
예제 입력 6 복사
C1 B1 3
L
T
LB
예제 출력 6 복사
B2
A1
<Code>
import sys
input = sys.stdin.readline
king, stone, n= map(str,input().split())
dx = [1,-1,0,0,1,-1,1,-1]
dy = [0,0,-1,1,1,1,-1,-1]
direction = ['R','L','B','T','RT','LT','RB','LB']
col = ['A','B','C','D','E','F','G','H']
k_pos = [col.index(king[0])+1,int(king[1])] # 1-8
s_pos = [col.index(stone[0])+1,int(stone[1])] # 1-8
for _ in range(int(n)):
idx = direction.index(input().strip())
#next pos king
nx = k_pos[0] + dx[idx]
ny = k_pos[1] + dy[idx]
#다음 좌표가 체스판 밖일 경우
if nx<1 or ny<1 or nx>8 or ny>8:
continue
#king 다음 좌표가 stone의 현재 좌표와 겹칠 경우
if nx == s_pos[0] and ny == s_pos[1]:
#stone의 다음 좌표
px = s_pos[0] + dx[idx]
py = s_pos[1] + dy[idx]
#다음 좌표가 체스판 밖일 경우
if px<1 or py<1 or px>8 or py>8:
continue
#stone 좌표 갱신
s_pos[0] = px
s_pos[1] = py
#king 좌표 갱신
k_pos[0] = nx
k_pos[1] = ny
#최종 king 좌표
print(col[k_pos[0]-1] + str(k_pos[1]))
#최종 stone 좌표
print(col[s_pos[0]-1] + str(s_pos[1]))
<Insight>
- 처음에 이차원 배열을 구현하여 문제를 해결하려고 접근시도 -> 실패
- x축 좌표가 정수가 아닌 알파벳으로 구성되어 있어, 리스트화 시킨 후 해당 리스트의 인덱스로 주 로직을 수행한 후 마지막에 리스트의 원소인 알파벳으로 출력시켜준다.
- dx, dy는 dfs,bfs에서만 사용해보아서 해당 문제에 적용 시키기에 많은 생각을 함.(이차원 배열 상태에서만 쓴다는 고정관념...)
'Algorithm' 카테고리의 다른 글
[Algorithm]백준1448<python>(sil3)DP (0) | 2022.06.21 |
---|---|
[Algorithm]백준1463<python>(sil3)DP (0) | 2022.06.21 |
[Algorithm] Heap 정렬 구현(python) (0) | 2022.06.15 |
[Algorithm]Boj1003(sil3)DP (0) | 2022.06.13 |
[Algorithm]boj1002(sil3)Geometry (0) | 2022.06.10 |