이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

백준 4485(녹색 옷 입은 애가 젤다지?) - 다익스트라알고리즘, 힙구조, 최단거리- python

  • 2024.11.04 23:52
  • [백준] Python,Java로 풀기📖/최단거리
    반응형

    https://www.acmicpc.net/problem/4485

    예제 풀이

    일단 첨에는 DFS로 이용해서 풀었지만 아니나 다를까,, 바로 시간초과..⭐️

    그래서 생각한건 다익스트라 알고리즘으로 최단 경로 알고리즘이었다..

    예제 하나를 이용해서 다익스트라 알고리즘을 풀이하면 다음 사진과 같다고 생각하면 이해하기 쉽다. 

    만약 다익스트라 알고리즘이 먼가,, 이것부터라면 밑에 링크로 들어가는것을 추천한다 (나름 이코테 책보면서 정리해둔 다익스트라알고리즘이다. )

     

    [이코테] CHAPTER 09 최단 경로 알고리즘 - 다익스트라 최단 경로 알고리즘

    최단 경로 알고리즘(Shortest Path) : 가장 짧은 경로를 찾는 알고리즘 1) 최단 경로 문제- 지점( 노드 ), 지점 간 연결된 도로( 간선 ) - 한 지점에서 다른 한 지점까지의 최단 경로를 구해야 하는 경우

    coooco.tistory.com

     


    문제 핵심🥸

    ① 우선순위 큐 사용(heapq) : heaq 모듈 사용 -> 비용이 적은 노드부터 꺼냄
    ② 상하좌우 탐색 사용 : move = [(-1,0),(1,0),(0,-1),(0,1)] 배열 선언하고 상하좌우 이동
    ③ visited 이차원 배열에 최단 경로 갱신
    ④ 큐가 비어지면 탐색이 종료

     


    코드 작성

    💻Python(파이썬)

    import sys
    import heapq
    
    # 무한대를 나타내는 값 설정
    INF = int(1e9)
    
    input = sys.stdin.readline
    
    # 다익스트라 알고리즘 함수 정의
    def dijkstra(graph, n):
        # 각 노드의 최소 비용을 기록할 2차원 리스트 초기화 (무한대로 초기화)
        visited = [[INF] * n for _ in range(n)]
        visited[0][0] = graph[0][0]  # 시작 지점의 비용 설정
    
        # 우선순위 큐 사용 (현재 비용, x 좌표, y 좌표)
        q = []
        heapq.heappush(q, (graph[0][0], 0, 0))  # 시작점 추가
    
        # 상하좌우 이동을 위한 배열
        move = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    
        # 큐가 비어 있지 않을 때까지 반복
        while q:
            # 가장 짧은 거리를 가진 노드 정보 꺼내기
            cost, x, y = heapq.heappop(q)
    
            # 인접한 노드 탐색
            for dx, dy in move:
                new_x, new_y = x + dx, y + dy
    
                # 그래프 범위를 벗어나지 않는지 확인
                if 0 <= new_x < n and 0 <= new_y < n:
                    # 현재 노드를 통해 인접 노드로 이동하는 비용 계산
                    new_cost = cost + graph[new_x][new_y]
    
                    # 계산된 비용이 기록된 비용보다 작으면 갱신
                    if new_cost < visited[new_x][new_y]:
                        visited[new_x][new_y] = new_cost
                        heapq.heappush(q, (new_cost, new_x, new_y))  # 큐에 추가
    
        # 목적지 (n-1, n-1)의 최소 비용 반환
        return visited[n-1][n-1]
    
    # 입력 처리 및 다익스트라 알고리즘 실행
    n = int(input().strip())
    count = 1  # 문제 번호
    while n:
        # 그래프 입력
        graph = [list(map(int, input().strip().split())) for _ in range(n)]
    
        # 다익스트라 알고리즘 실행 및 결과 출력
        result = dijkstra(graph, n)
        print("Problem %d: %d" % (count, result))
    
        count += 1  # 문제 번호 증가
        n = int(input().strip())  # 다음 그래프의 크기 입력
    반응형

    '[백준] Python,Java로 풀기📖 > 최단거리' 카테고리의 다른 글

    백준 10159(저울) - Python(파이썬),Java(자바) - 플로이드 워셜  (0) 2022.06.26
    백준 1140(플로이드) -Python(파이썬) - 플로이드워셜 알고리즘  (0) 2022.06.20
    백준 2110(공유기 설치) - Python(파이썬) - 이분탐색  (0) 2022.06.20
    백준 1504(특정한 최단 경로) - Python(파이썬) - 최단 경로  (0) 2022.06.12

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 백준 10159(저울) - Python(파이썬),Java(자바) - 플로이드 워셜

      백준 10159(저울) - Python(파이썬),Java(자바) - 플로이드 워셜

      2022.06.26
    • 백준 1140(플로이드) -Python(파이썬) - 플로이드워셜 알고리즘

      백준 1140(플로이드) -Python(파이썬) - 플로이드워셜 알고리즘

      2022.06.20
    • 백준 2110(공유기 설치) - Python(파이썬) - 이분탐색

      백준 2110(공유기 설치) - Python(파이썬) - 이분탐색

      2022.06.20
    • 백준 1504(특정한 최단 경로) - Python(파이썬) - 최단 경로

      백준 1504(특정한 최단 경로) - Python(파이썬) - 최단 경로

      2022.06.12
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (168)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (4)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • 코딩테스트준비
    • 항해99
    • TiL
    • 오블완
    • 백준
    • 99클럽
    • 프로그래머스
    • 티스토리챌린지

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바