풀이 방법
- 칸이 흰색일 경우, 빨간색일 경우, 파란색일 경우(=범위를 넘어갈 경우)를 구분해서 각각을 구현하면 된다.
- 빨간색일 경우 list.reverse()를 이용한다.
- 말이 4개 이상 쌓이는 경우 바로 종료해야 하므로, 이동했을 때 바로 그 이동한 위치의 말의 개수가 몇 개인지 확인하고 4개 이상이면 종료시킨다.
전체 코드
n, k = map(int, input().split())
board = []
for i in range(n):
board.append(list(map(int, input().split())))
horse = []
horse_pos = [[[] for _ in range(n)] for _ in range(n)]
for i in range(k):
r, c, d = map(int, input().split())
horse.append([r-1, c-1, d-1])
horse_pos[r-1][c-1].append(i)
move = [(0,1),(0,-1),(-1,0),(1,0)]
change_dir = [1,0,3,2]
for t in range(0, 1000):
r, c = horse[0][0], horse[0][1]
for i in range(k):
r, c, d = horse[i]
cr, cc = r+move[d][0], c+move[d][1]
if (not (0<=cr<n and 0<=cc<n)) or board[cr][cc] == 2:
horse[i][2] = change_dir[d]
r, c, d = horse[i]
cr, cc = r + move[d][0], c + move[d][1]
if (not (0 <= cr < n and 0 <= cc < n)) or board[cr][cc] == 2: continue
if board[cr][cc] == 0:
idx = horse_pos[r][c].index(i)
temp = horse_pos[r][c][idx:]
for j in horse_pos[r][c][idx:]:
horse[j][0] = cr
horse[j][1] = cc
elif board[cr][cc] == 1:
idx = horse_pos[r][c].index(i)
temp = horse_pos[r][c][idx:]
for j in temp:
horse[j][0] = cr
horse[j][1] = cc
temp.reverse()
horse_pos[cr][cc].extend(temp)
horse_pos[r][c] = horse_pos[r][c][:idx]
if len(horse_pos[cr][cc]) >= 4:
print(t+1)
exit(0)
else:
print(-1)
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Python] 백준 17822: 원판 돌리기 (0) | 2021.04.16 |
---|---|
[Python] 백준 17779: 게리맨더링 2 (0) | 2021.04.16 |
[Python] 백준 17142 : 연구소 3 (0) | 2021.04.15 |
[Python] 백준 17143 : 낚시왕 (0) | 2021.04.14 |
[Python] 백준 17144 : 미세먼지 안녕! (0) | 2021.04.12 |