17837. 새로운 게임 2 문제 바로가기
해결 방법
보드의 색을 저장하는 리스트 :
board
말의 번호와 방향을 저장하는 리스트 :
horse_board
를 이용하여 시뮬레이션을 진행했습니다.
while 문 안의 과정 설명
말 번호 0 ~ K -1 순서대로 말의 위치 찾기
말 번호를 찾으면 위치의 칸 색을 확인하기
말 번호와 위에 쌓여있는 말들 저장하는 리스트 :
temp
해당 말 번호 밑에 있는 말들 저장하는 리스트 :
left
- 흰색이면 이동하려는 칸에 temp 추가하고 원래 위치에는 left 남겨두기
- 빨간색이면 이동하려는 칸에 temp 역순으로 추가하고 원래 위치에 left 남겨두기
- 파란색이면 방향 반대로 이동하여 이동할 위치 칸에 따라 동작하도록 하기 → 함수 blueMove
- 이동하려는 위치가 좌표밖이면 blueMove 파란칸처럼 동작하도록 하기
tip! ) 파란색인 경우 이동하려는 곳이 파란색인지 아닌지만 체크하면 안된다! 흰색인지 빨간색인지를 확인하며 동작해야 통과할 수 있었습니다.
구현한 코드
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
def blueMove(y, x, h, hd, temp, left): # 파란칸인 경우 동작하는 함수
# 방향 반대로 바꾸기
if hd % 2: # 홀수인 경우
bh = hd - 1
else: # 짝수인 경우
bh = hd + 1
horse_board[y][x][h][1] = bh
by, bx = y + dirs[bh][0], x + dirs[bh][1] # 방향 반대로 저장하기
if 0 <= by < N and 0 <= bx < N:
# 이동하려는 곳이 흰색인 경우
if board[by][bx] == 0:
horse_board[by][bx].extend(temp)
horse_board[y][x] = left
# 이동하려는 곳이 빨간색인 경우
elif board[by][bx] == 1:
horse_board[by][bx].extend(temp[::-1])
horse_board[y][x] = left
# 입력받기
N, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)] # 색을 저장하는 리스트
horse_board = [[[] for _ in range(N)] for _ in range(N)] # 말의 위치를 저장할 리스트
dirs = [[0, 1], [0, -1], [-1, 0], [1, 0]] # 오른쪽, 왼쪽, 위, 아래
for k in range(K):
r, c, d = map(int, input().split())
r, c, d = r - 1, c - 1, d - 1
horse_board[r][c].append([k, d])
answer = -1
cnt = 1 # 게임의 턴을 저장할 변수
frag = False # 턴이 종료되는 조건이 될 변수
while True:
if cnt >= 1000: break # 종료조건
if frag: break
for k in range(K):
find = False # 말 위치 찾으면 다음 말 위치 찾을 수 있도록 하는 변수
if frag: break
for y in range(N):
if find: break
if frag: break
for x in range(N):
if find: break
if frag: break
if horse_board[y][x] != []:
for h in range(len(horse_board[y][x])):
if horse_board[y][x][h][0] == k:
find = True # 해당하는 말 번호 찾았기에 체크
hd = horse_board[y][x][h][1] # 말 방향 저장하는 변수
ny, nx = y + dirs[hd][0], x + dirs[hd][1]
temp = horse_board[y][x][h:] # 이동할 말 포함하여 위에 있는 말 저장하는 리스트
left = horse_board[y][x][:h] # 이동할 말 밑에 있는 말 저장하는 리스트
if 0 <= ny < N and 0 <= nx < N:
if board[ny][nx] == 0: # 체스판이 흰색인 경우
horse_board[ny][nx].extend(temp)
horse_board[y][x] = left
elif board[ny][nx] == 1: # 체스판이 빨간색인 경우
horse_board[ny][nx].extend(temp[::-1])
horse_board[y][x] = left
else: # 체스판이 파란색인 경우
blueMove(y, x, h, hd, temp, left)
else: # 체크판 벗어나는 경우: 체스판이 파란색인 경우
blueMove(y, x, h, hd, temp, left)
# 각 말 이동마다 체스판 위에 말이 4개 이상 있는지 확인하기
for cy in range(N):
if frag: break
for cx in range(N):
if len(horse_board[cy][cx]) >= 4:
answer = cnt # 턴 저장하기
frag = True # 종료시키기
break
break
cnt += 1
print(answer)