본문 바로가기
Algorithm(CodeTree, Python)/BFS

[코드트리] K번 최댓값으로 이동하기 Python

by kurooru 2023. 2. 28.
# n, k 입력
n, k = map(int, input().split())

# grid 입력
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]

# r, c 입력
r, c = map(int, input().split())
r -= 1
c -= 1

# in_range(x, y)
def in_range(x, y):
    return 0 <= x < n and 0 <= y < n

# can_go(x, y, curr_num)
def can_go(x, y, curr_num):
    # 범위 내에 있고, 방문한 적 없으며, curr_num보다 작으면 가능
    return in_range(x, y) and not visited[x][y] and grid[x][y] < curr_num

# bfs(curr_num)
def bfs(curr_num):
    while q:
        x, y = q.popleft()
        dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
        for dx, dy in zip(dxs, dys):
            nx, ny = x + dx, y + dy
            # 갈 수 있으면
            if can_go(nx, ny, curr_num):
                # 방문 처리 후
                visited[nx][ny] = True
                # 큐에 넣어주기
                q.append((nx, ny))

# 설계
# 큐 사용 준비
from collections import deque
q = deque()

# k번 반복
for _ in range(k):
    
    # visited
    visited = [
        [False] * n
        for _ in range(n)
    ]

    q.append((r, c))
    # visited[r][c] = True
    bfs(grid[r][c])

    # curr_max
    curr_max = 0

    # grid를 돌면서
    for i in range(n):
        for j in range(n):
            # 방문한 점이고, curr_max보다 크면
            if visited[i][j] and grid[i][j] > curr_max:
                # curr_max update
                curr_max = grid[i][j]
                # new_r, new_c
                new_r, new_c = i, j
    
    # 움직이지 못했을 경우
    if curr_max == 0:
        # 출력 후
        print(r+1, c+1)
        # 프로그램 종료
        quit()
    
    # 움직였을 경우
    else:
        # r, c update
        r, c = new_r, new_c

# 출력
print(r+1, c+1)