Programmers / 부대복귀(최단경로알고리즘 - 다익스트라) / Python 파이썬

2023. 7. 7. 13:07·coding test - python/Programmers
728x90
반응형

 

*문제 출처는 프로그래머스에 있습니다.

문제 제목: 부대복귀(최단경로알고리즘 - 다익스트라) - 3단계 

문제 사이트: https://school.programmers.co.kr/questions/51058

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


나의 풀이 - 시간초과

bfs로 접근했는데 시간초과가 났다..

import sys

from collections import deque, defaultdict
input = sys.stdin.readline

def bfs(n,maps,start,end):
    queue = deque([[start,0]])
    visited = [0 for i in range(n+1)]
    min_cnt = 1e9
    while queue:
        q,cnt = queue.popleft()
        visited[q] = 1
        if q == end:
            min_cnt = min(min_cnt,cnt)
        if min_cnt > cnt and maps[q]:
            for i in maps[q]:
                if visited[i] == 0:
                        queue.append([i,cnt + 1])
        
    if min_cnt == 1e9:
        return -1
    else:
        return min_cnt
        
def solution(n, roads, sources, destination):
    answer = []
    
    # 경로에 따른 맵 만들기
    maps = defaultdict(set)
    for r in roads:
        maps[r[0]].add(r[1])
        maps[r[1]].add(r[0])
    
    for s in sources:
        a = bfs(n,maps,s,destination)
        answer.append(a)
    
    return answer

 

다른 풀이

- 이것도 시간 초과됨

import sys
from collections import deque, defaultdict
input = sys.stdin.readline

def dijkstra(n, maps, start, end):
    queue = deque([[start, 0]])
    dist = [1e9 for i in range(n+1)]
    dist[start] = 0
    min_cnt = 1e9
    while queue:
        q, cnt = queue.popleft()
        if dist[q] < cnt:
            continue
        for next_node in maps[q]:
            if dist[next_node] > cnt + 1:
                dist[next_node] = cnt + 1
                queue.append([next_node, cnt+1])
    if dist[end] == 1e9:
        return -1
    else:
        return dist[end]

def solution(n, roads, sources, destination):
    answer = []

    # 경로에 따른 맵 만들기
    maps = defaultdict(set)
    for r in roads:
        maps[r[0]].add(r[1])
        maps[r[1]].add(r[0])

    for s in sources:
        a = dijkstra(n, maps, s, destination)
        answer.append(a)

    return answer

 

다른 풀이 보면서 참고한 결과..

결국 목적지까지 가는데 최단 경로를 구하면 되는거라서

목적지를 시작지점으로 잡아야한다.!!

 

최종풀이

import sys
from collections import deque, defaultdict
input = sys.stdin.readline

def dijkstra(n, maps, start):
    queue = deque([[start, 0]])
    dist = [1e9 for i in range(n+1)]
    dist[start] = 0
    while queue:
        q, cnt = queue.popleft()
        if dist[q] < cnt:
            continue
        for next_node in maps[q]:
            if dist[next_node] > cnt + 1:
                dist[next_node] = cnt + 1
                queue.append([next_node, cnt+1])
    return dist

def solution(n, roads, sources, destination):
    answer = []

    # 경로에 따른 맵 만들기
    maps = defaultdict(set)
    for r in roads:
        maps[r[0]].add(r[1])
        maps[r[1]].add(r[0])

    dist = dijkstra(n, maps,destination)
    
    for i in sources:
        if dist[i] == 1e9:
            answer.append(-1)
        else:
            answer.append(dist[i])
        

    return answer


※ 알아야 할 것

- 다익스트라 알고리즘을 이용하자.. 한 지점에서의 최단경로를 구할 수 있음!

 

728x90
반응형

'coding test - python > Programmers' 카테고리의 다른 글

Programmers / 서버 증설 횟수 / Python 파이썬  (0) 2025.03.11
Programmers / 공원 산책 / Python 파이썬  (1) 2025.03.10
Programmers / 연속된 부분 수열의 합 - 투포인터 / Python 파이썬  (0) 2023.06.26
Programmers / 풍선터트리기 (작성중) / Python 파이썬  (0) 2023.04.05
Programmers / 연속 펄스 부분 수열의 합 - 부분합 DP / Python 파이썬  (0) 2023.04.05
'coding test - python/Programmers' 카테고리의 다른 글
  • Programmers / 서버 증설 횟수 / Python 파이썬
  • Programmers / 공원 산책 / Python 파이썬
  • Programmers / 연속된 부분 수열의 합 - 투포인터 / Python 파이썬
  • Programmers / 풍선터트리기 (작성중) / Python 파이썬
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (614)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    programmers
    Python
    소수
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
Programmers / 부대복귀(최단경로알고리즘 - 다익스트라) / Python 파이썬
상단으로

티스토리툴바