백준 온라인 저지 1063번 ‘킹’
파이썬 알고리즘 문제풀이
문제
위의 문제 링크 참고
킹은 다음과 같이 움직일 수 있다.
R : 한 칸 오른쪽으로 L : 한 칸 왼쪽으로 B : 한 칸 아래로 T : 한 칸 위로 RT : 오른쪽 위 대각선으로 LT : 왼쪽 위 대각선으로 RB : 오른쪽 아래 대각선으로 LB : 왼쪽 아래 대각선으로
체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다.
입력
첫째 줄에 킹의 위치, 돌의 위치, 움직이는 횟수 N이 주어진다. 둘째 줄부터 N개의 줄에는 킹이 어떻게 움직어여 하는지 주어진다. N은 50보다 작거나 같은 자연수이고, 움직이는 정보는 위에 써 있는 8가지 중 하나이다.
출력
첫째 줄에 킹의 마지막 위치, 둘째 줄에 돌의 마지막 위치를 출력한다.
풀이
코딩의 핵심은 문제 그대로 1) 킹과 돌이 체스판 안에서만 움직이는 것 2) 킹의 진행방향에 돌이 있을 경우를 판단하는 것과 그 이후 동작 3) 그리고 위의 두 알고리즘을 어떤 순서로 두어야 할 것인가
소스코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#문자로 입력 받은 좌표를 숫자로 변환하기 위함
char_list = {
'A' : 1,
'B' : 2,
'C' : 3,
'D' : 4,
'E' : 5,
'F' : 6,
'G' : 7,
'H' : 8
}
alphabet = 'ABCDEFGH'
# 킹의 이동 방법을 각 함수로 정의했음
# 다른 모든 방향에 대해서 같은 방식이므로 R만 주석을 닮.
# a는 킹, b는 돌
# 킹의 이동방향에 돌이 있을 경우 / 없을 경우를 if else로 나누었고
# 돌이 있을 경우에는 돌이 이동 가능한지 확인하고, 가능하면 둘 다 이동
# 돌이 없을 경우에는 킹만 이동
def R(a, b):
# a의 이동 방향에 b가 있을 경우에
if [a[0] + 1, a[1]] == b:
# a와 b 모두 이동 가능한지 확인하고,(사실은 b만 확인해도 될 듯)
if (a[0] + 1) < 9 and (b[0] + 1) < 9:
# a와 b 둘 다 이동
a[0] = a[0] + 1
b[0] = b[0] + 1
# a의 이동 방향에 b가 없으면,
else:
# a가 이동 가능한지만 확인하고 이동하면 됨
if (a[0] + 1) < 9:
a[0] = a[0] + 1
return(a, b)
def L(a, b):
if [a[0] - 1, a[1]] == b:
if (a[0] - 1) > 0 and (b[0] - 1) > 0:
a[0] = a[0] - 1
b[0] = b[0] - 1
else:
if (a[0] - 1) > 0:
a[0] = a[0] - 1
return (a, b)
def B(a, b):
if [a[0], a[1] - 1] == b:
if (a[1] - 1) > 0 and b[1] - 1 > 0:
a[1] = a[1] - 1
b[1] = b[1] - 1
else:
if (a[1] - 1) > 0:
a[1] = a[1] - 1
return (a, b)
def T(a, b):
if [a[0], a[1] + 1] == b:
if (a[1] + 1) < 9 and b[1] + 1< 9:
a[1] = a[1] + 1
b[1] = b[1] + 1
else:
if (a[1] + 1) < 9:
a[1] = a[1] + 1
return(a, b)
def RT(a, b):
if [a[0] + 1, a[1] + 1] == b:
if (a[0] + 1) < 9 and (b[0] + 1) < 9 and (a[1] + 1) < 9 and (b[1] + 1) < 9:
a[0] = a[0] + 1
b[0] = b[0] + 1
a[1] = a[1] + 1
b[1] = b[1] + 1
else:
if (a[0] + 1) < 9 and (a[1] + 1) < 9:
a[0] = a[0] + 1
a[1] = a[1] + 1
return(a,b)
def LT(a, b):
if [a[0] - 1, a[1] + 1] == b:
if (a[0] - 1) > 0 and (b[0] - 1) > 0 and (a[1] + 1) < 9 and (b[1] + 1) < 9:
a[0] = a[0] - 1
b[0] = b[0] - 1
a[1] = a[1] + 1
b[1] = b[1] + 1
else:
if (a[0] - 1) > 0 and (a[1] + 1) < 9:
a[0] = a[0] - 1
a[1] = a[1] + 1
return(a,b)
def RB(a, b):
if [a[0] + 1, a[1] - 1] == b:
if (a[0] + 1) < 9 and (b[0] + 1) < 9 and (a[1] - 1) > 0 and b[1] - 1 > 0:
a[0] = a[0] + 1
b[0] = b[0] + 1
a[1] = a[1] - 1
b[1] = b[1] - 1
else:
if (a[0] + 1) < 9 and (a[1] - 1) > 0 :
a[0] = a[0] + 1
a[1] = a[1] - 1
return (a, b)
def LB(a, b):
if [a[0] - 1, a[1] - 1] == b:
if (a[0] - 1) > 0 and (b[0] - 1) > 0 and (a[1] - 1) > 0 and b[1] - 1 > 0:
a[0] = a[0] - 1
b[0] = b[0] - 1
a[1] = a[1] - 1
b[1] = b[1] - 1
else:
if (a[0] - 1) > 0 and (a[1] - 1) > 0:
a[0] = a[0] - 1
a[1] = a[1] - 1
return (a, b)
# 킹, 돌, 움직이는 횟수 입력
a, b, c = input().split(' ')
a = [int(char_list[a[0]]) , int(a[1])]
b = [int(char_list[b[0]]) , int(b[1])]
c = int(c)
# 움직이는 횟수마다 입력되는 값에 따라 함수 실행
for i in range(c):
move = input()
if move == 'R':
R(a, b)
if move == 'L':
L(a, b)
if move == 'T':
T(a, b)
if move == 'B':
B(a, b)
if move == 'RT':
RT(a, b)
if move == 'LT':
LT(a, b)
if move == 'RB':
RB(a, b)
if move == 'LB':
LB(a, b)
# 숫자로 된 좌표를 알파벳+숫자로 변환
print(alphabet[a[0]-1]+str(a[1]))
print(alphabet[b[0]-1]+str(b[1]))
배운 것
1
[1, 2] != (1, 2)
2차원 배열 만들기
1
board = [[0 for i in range(10)] for j in range(10)]
코멘트
고민하는 재미가 있는 그런 문제였지만, 아무래도 내 코드가 조잡하다는 느낌을 지울 수 없다.