풀이 시간
- 1h 41m
- 코드 다 짜놓고 "턴이 진행되던 중에 말이 4개 이상 쌓이는 순간 바로 종료"를 해줬어야했는데 바로 종료하지 않고 하나의 턴을 완료하고 말이 4개 이상 쌓인 곳이 있는 지를 확인하는 방식으로 했어서 뭐가 문제인지 한참 찾다가 한 시간을 까먹음.. 억까 아닌 억까다
구현 방식
- 전반적인 구현 방식은 "17780: 새로운 게임"(click!)과 거의 비슷하다
- 17780번과의 차이점은 0번 말부터 순서대로 이동하는데, 말이 가장 아래에 있지 않아도 이동을 수행한다는 점이다
-> check[x][y]의 길이만큼 for문을 돌면서, i(현재 이동하고자 하는 horse의 번호)를 만난다면 해당 위치부터 pop을 수행하여 horse_num을 빼내고, 해당 horse_num의 위치를 변경해주고 check[nx][ny]에 horse_num을 append 해준다 (빨간색의 경우 tail에서부터 pop 수행)
코드
import sys
from collections import deque
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
N, K = map(int, sys.stdin.readline()[:-1].split())
board = []
for n in range(N):
board.append(list(map(int, sys.stdin.readline()[:-1].split())))
horses = []; check = [[[] for _ in range(N)] for _ in range(N)]
for k in range(K):
x, y, direction = map(int, sys.stdin.readline()[:-1].split())
horses.append([x-1, y-1, direction-1])
check[x-1][y-1].append(k)
turn = 0
while True:
turn += 1
if turn > 1000:
print(-1)
exit()
for i in range(len(horses)):
x, y, direction = horses[i]
nx = x + dx[direction]; ny = y + dy[direction]
if 0 <= nx < N and 0 <= ny < N:
if board[nx][ny] == 0:
for start in range(len(check[x][y])):
if check[x][y][start] == i:
for _ in range(len(check[x][y]) - start):
horse_num = check[x][y].pop(start)
horses[horse_num][0] = nx; horses[horse_num][1] = ny
check[nx][ny].append(horse_num)
break
elif board[nx][ny] == 1:
for start in range(len(check[x][y])):
if check[x][y][start] == i:
for _ in range(len(check[x][y]) - start):
horse_num = check[x][y].pop()
horses[horse_num][0] = nx; horses[horse_num][1] = ny
check[nx][ny].append(horse_num)
break
elif board[nx][ny] == 2:
if direction == 0: direction = 1
elif direction == 1: direction = 0
elif direction == 2: direction = 3
elif direction == 3: direction = 2
horses[i][2] = direction
nx = x + dx[direction]; ny = y + dy[direction]
if 0 <= nx < N and 0 <= ny < N:
if board[nx][ny] == 0:
for start in range(len(check[x][y])):
if check[x][y][start] == i:
for _ in range(len(check[x][y]) - start):
horse_num = check[x][y].pop(start)
horses[horse_num][0] = nx; horses[horse_num][1] = ny
check[nx][ny].append(horse_num)
break
elif board[nx][ny] == 1:
for start in range(len(check[x][y])):
if check[x][y][start] == i:
for _ in range(len(check[x][y]) - start):
horse_num = check[x][y].pop()
horses[horse_num][0] = nx; horses[horse_num][1] = ny
check[nx][ny].append(horse_num)
break
elif board[nx][ny] == 2:
nx = x; ny = y
else:
nx = x; ny = y
else:
if direction == 0: direction = 1
elif direction == 1: direction = 0
elif direction == 2: direction = 3
elif direction == 3: direction = 2
horses[i][2] = direction
nx = x + dx[direction]; ny = y + dy[direction]
if 0 <= nx < N and 0 <= ny < N:
if board[nx][ny] == 0:
for start in range(len(check[x][y])):
if check[x][y][start] == i:
for _ in range(len(check[x][y]) - start):
horse_num = check[x][y].pop(start)
horses[horse_num][0] = nx; horses[horse_num][1] = ny
check[nx][ny].append(horse_num)
break
elif board[nx][ny] == 1:
for start in range(len(check[x][y])):
if check[x][y][start] == i:
for _ in range(len(check[x][y]) - start):
horse_num = check[x][y].pop()
horses[horse_num][0] = nx; horses[horse_num][1] = ny
check[nx][ny].append(horse_num)
break
elif board[nx][ny] == 2:
nx = x; ny = y
else:
nx = x; ny = y
if len(check[nx][ny]) >= 4:
print(turn)
exit()
결과
소중한 정보 감사드립니다!