-
[BOJ/python] 2412번 암벽 등반알고리즘/BOJ 2022. 7. 1. 16:33
백준 2412번 암벽 등반 파이썬
문제 출처 - https://www.acmicpc.net/problem/2412
그래프 문제 하나 가볍게 푼다고 생각했는데 예상치 못하게 시간을 많이 소비했다. 알고리즘분석 수업에서 2차원 그래프에서 가장 가까운 두 점의 거리 문제를 다루었던 기억이 났다. 비둘기 집 원리로 접근했는데 이번 문제에서도 한 점에서 최대 25개까지만 방문할 수 있다는 점을 고려해서 문제를 접근했다.
처음에는 G 배열에 모든 좌표를 넣고 좌표 하나를 한 개의 노드로 여기고 다익스트라로 풀었다. G를 정렬해서 앞뒤로 최대 25개만 탐색하면 쉽게 풀 수 있겠다고 생각했다. 하지만 착각이었다.
G 배열을 정렬할 때 x 좌표를 우선으로 정렬을 하게 되면 x 거리가 가까워도 25개의 인덱스 내에 없을 수도 있다.
예를 들어 G=[[1,2],[1,3],…[1,100],[2,3],[2,7]] 일 때, [1,2]에서 [2,3]으로 이동할 수 있지만 G에서 인덱스 차이는 100이 넘는다.
0. 코드 (오답)
# boj-2412.py #2412번 암벽 등반 from heapq import heappop, heappush N,T = map(int, input().split()) G=[[0,0]] for _ in range(N): G.append(list(map(int,input().split()))) G.sort(key=lambda x:(x[0],x[1])) N+=1 dist = [ float('inf') for _ in range(N) ] heap = [[0,0]] dist[0]=0 while heap: cost, node = heappop(heap) if G[node][1]==T: sol = cost break if dist[node] < cost: continue # 비둘기집, 최대 25 인덱스 이내의 암벽으로만 이동 가능 for next in range(node-25,node+25): if next<0 or next>=N: continue x,y = G[node] a,b = G[next] if abs(x-a)<=2 and abs(y-b)<=2 and dist[next]>cost+1: dist[next]=cost+1 heappush(heap, [ dist[next], next ]) print(sol)
1. 풀이
- 주어지는 좌표를 딕셔너리 형태로 저장한다.
- x,y 좌표의 차이가 2이하인 좌표들 중 최단 거리 갱신이 가능하면 방문한다.
- 다익스트라 알고리즘을 수행하며 y 좌표가 T가 되면 중단하고 답을 출력한다.
2. 코드 (정답, 다익스트라)
# boj-2412.py #2412번 암벽 등반 from collections import deque from heapq import heappop, heappush N,T = map(int, input().split()) G={0:{0:1}} dist={0:{0:float('inf')}} for _ in range(N): x,y = (map(int,input().split())) if x in G: G[x][y]=1 dist[x][y]=float('inf') else: G[x]={y:1} dist[x]={y:float('inf')} sol=-1 heap=[[0,0,0]] dist[0][0]=0 while heap: cost, x,y = heappop(heap) if y==T: sol = cost break if dist[x][y] < cost: continue for nx in range(x-2,x+3): for ny in range(y-2,y+3): if 0<=nx<=1000000 and 0<=ny<=T : if nx in G : if ny in G[nx]: if dist[nx][ny]>cost+1 : dist[nx][ny]=cost+1 heappush(heap, [dist[nx][ny], nx,ny]) print(sol)
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ/python]1765번 닭싸움 팀 정하기 (0) 2022.07.03 [BOJ/python] 6987번 월드컵 (0) 2022.07.01 [BOJ/python] 2982번 국왕의 방문 (0) 2022.06.30 [BOJ/python]2263번 트리의 순회 (0) 2022.06.29 [BOJ/python] 2623번 음악프로그램 (0) 2022.06.29