Posts [baekjoon] 17837. 새로운 게임2 (python)
Post
Cancel

[baekjoon] 17837. 새로운 게임2 (python)

17837. 새로운 게임 2 문제 바로가기

해결 방법

  • 보드의 색을 저장하는 리스트 : board

  • 말의 번호와 방향을 저장하는 리스트 : horse_board

    를 이용하여 시뮬레이션을 진행했습니다.

while 문 안의 과정 설명

  1. 말 번호 0 ~ K -1 순서대로 말의 위치 찾기

  2. 말 번호를 찾으면 위치의 칸 색을 확인하기

    말 번호와 위에 쌓여있는 말들 저장하는 리스트 : temp

    해당 말 번호 밑에 있는 말들 저장하는 리스트 : left

    1. 흰색이면 이동하려는 칸에 temp 추가하고 원래 위치에는 left 남겨두기
    2. 빨간색이면 이동하려는 칸에 temp 역순으로 추가하고 원래 위치에 left 남겨두기
    3. 파란색이면 방향 반대로 이동하여 이동할 위치 칸에 따라 동작하도록 하기 → 함수 blueMove
    4. 이동하려는 위치가 좌표밖이면 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)
This post is licensed under CC BY 4.0 by the author.

[baekjoon] 20057. 마법사 상어와 토네이도 (python)

[baekjoon] 20061. 모노미노도미노2 (python)

Comments powered by Disqus.