알고리즘/코드트리
[코드트리/INTERMEDIATE LOW] BFS K번 최댓값으로 이동하기 Python 파이썬
감싹이
2023. 8. 15. 22:47
🔥 문제 링크
https://www.codetree.ai/missions/2/problems/move-to-max-k-times?utm_source=clipboard&utm_medium=text
🔥 문제
🔥 풀이
✅ 살짝 응용된 BFS 문제.. 90포인트나 주지만 사실 고려해야 할 조건만 잘 설정하면 어렵지 않은 문제다.
✔️ 조건1 : 시작 위치가 1씩 크게 주어지기 때문에 그래프를 n+1 크기만큼 받을 게 아니라면 -1 해준 값으로 시작하고 결과 출력할 때 +1 해서 출력해야 함
✔️ 조건2 : k(저는 turn 변수로 받았음)만큼 반복하며 bfs를 수행해야 함
✔️ 조건3 : 기록해 둔 시작 위치의 값보다 작은값 중에 제일 큰 값과 그 좌표를 갱신해야 함
✔️ 조건4 : 제일 큰 값을 가진 좌표가 여러개일 경우 먼저 행을 고려하고 그 다음 열을 고려해서 좌표를 갱신해야 함
🔥 코드
from collections import deque
n, turn = map(int, input().split())
ground = [list(map(int, input().split())) for _ in range(n)]
sx, sy = map(int, input().split())
# 조건1 : 시작 위치가 1씩 크게 주어지기 때문에 그래프를 n+1 크기만큼 받을 게 아니라면 -1 해준 값으로 시작하고 결과 출력할 때 +1 해서 출력해야 함
sx -= 1
sy -= 1
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
ans_x = sx
ans_y = sy
# 조건2 : k(저는 turn 변수로 받았음)만큼 반복하며 bfs를 수행해야 함
for _ in range(turn):
max_num = 0
visited = [[False]*n for _ in range(n)]
q = deque()
q.append([ans_x, ans_y])
visited[ans_x][ans_y] = True
# bfs
while q:
now_x, now_y = q.pop()
for i in range(4):
nx = now_x + dx[i]
ny = now_y + dy[i]
if 0 <= nx < n and 0 <= ny < n:
# 조건3 : 시작 위치의 값보다 작은값 중에 제일 큰 값과 그 좌표를 갱신해야 함
if not visited[nx][ny] and ground[nx][ny] < ground[sx][sy]:
q.append([nx, ny])
visited[nx][ny] = True
if ground[nx][ny] > max_num:
max_num = ground[nx][ny]
ans_x, ans_y = nx, ny
# 조건4 : 제일 큰 값을 가진 좌표가 여러개일 경우 먼저 행을 고려하고 그 다음 열을 고려해서 좌표를 갱신해야 함
elif ground[nx][ny] == max_num:
if ans_x > nx:
ans_x, ans_y = nx, ny
elif ans_x == nx:
if ans_y > ny:
ans_x, ans_y = nx, ny
# 시작 위치 갱신
sx = ans_x
sy = ans_y
print(f'{ans_x+1} {ans_y+1}')