99클럽 코테 스터디 10일차 TIL: 다익스트라

2024. 11. 6. 14:37·일기장/항해99클럽 4기

오늘의 문제: 18352. 특정 거리의 도시 찾기

오늘 문제는 언뜻 보기에 다익스트라 문제이다. 하지만 이 문제가 실버2인 이유가 있지 않을까 하고 바라보니 단순 BFS로 풀어도 문제가 없지 않을까 하는 생각이 먼저 들어서 BFS로 접근해보기로 했다.

아이디어: BFS로 풀 수 있지 않을까

from collections import deque

n,m,k,x=map(int,input().split())
graph=[[] for i in range(n+1)]
visit=[-1 for i in range(n+1)]

for i in range(m):
    a,b=map(int,input().split())
    graph[a].append(b)

def bfs(graph, start):
    deq=deque()
    idx=0
    visit[start]=idx
    deq.append(start)

    while deq:
        node=deq.popleft()
        idx=visit[node]
        for next in graph[node]:
            if visit[next]!=-1: continue
            else:
                visit[next]=idx+1
                deq.append(next)
    sum=0
    for i in range(1,n+1):
        if visit[i]==k: 
            print(i)
            sum+=1
    if sum==0: print(-1)
    
bfs(graph,x)

BFS 같은 기본적인 그래프는 이제 문제없이 짤 수 있다. 하지만 공부를 하기 위해서 다익스트라로도 짜기로 했다.

아이디어: 다익스트라 간선 비용을 1로 하자.

다익스트라를 공부 안한지 너무 오래 돼서 기억이 나지 않지만, 예전 답안을 보니 생각보다 BFS랑 비슷한 내용이 많았다. 약간 다른 점이라면 deque가 아닌 heapq를 이용한다는 것이다.

비용이 더 같거나 적을 때만 다시 heapq에 넣어서 검사하는 형식이다. 생각보다 이렇게 보니 어렵지 않은 로직이었다. 너무 쫄아있던게 아닌가 싶기도 하다. 다만 heapq를 이용하는 법은 좀 배울만 하다.

import heapq, math

n,m,k,x=map(int,input().split())
graph = [[] for _ in range(n+1)]
result = [ math.inf for _ in range(n+1)]

heap = []

# 그래프 채우기
for _ in range(m):
    a,b=map(int,input().split()) #
    graph[a].append((b,1))
    # graph[b].append((a,1))
    # 현재 그래프에 (다음 노드, 비용)을 추가

def dijkstra(start, res):
    heapq.heappush(heap, (0, start))
    res[start] = 0

    while heap:
        dist, node = heapq.heappop(heap)
        # 거리, 현재 노드

        if res[node] < dist: continue
        # 이미 현재 노드의 결과가 값이 더 작은 경우에는 패스

        for next in graph[node]:
            # 그렇다면 지금 노드에서 다른 노드로 탐색
            cost = dist + next[1]
            # 각 다음 노드에 현재까지의 비용 + 다음 노드로의 비용을 계산함

            if cost < res[next[0]]:
                # 계산 결과가 더 작은 값일 경우에는 갱신
                res[next[0]] = cost
                heapq.heappush(heap, (cost, next[0]))

dijkstra(x, result)
c = []
for i in range(1, n+1):
    if result[i]==k: c.append(i)
if len(c)==0: print(-1)
else: print(*sorted(c))

오늘의 회고

티어를 높이고 싶다면 다익스트라처럼 구현이 쉽지만 티어가 높은 문제들을 풀어야 한다. 다익스트라 문제를 작년에 슥 풀고 1년 정도 관심을 끄고 있었는데 다시 맛있는 문제들을 찾아보면 할만 할 듯하다.

'일기장 > 항해99클럽 4기' 카테고리의 다른 글

99클럽 코테 스터디 12일차 TIL: 3차원 BFS  (0) 2024.11.09
99클럽 코테 스터디 11일차 TIL: 골드 너비 우선 탐색  (0) 2024.11.07
99클럽 코테 스터디 9일차 TIL: 재귀 함수로 구현하는 그래프  (6) 2024.11.06
99클럽 코테 스터디 8일차 TIL: 그래프 탐색 및 DP  (0) 2024.11.05
99클럽 코테 스터디 7일차 TIL: 브루트포스  (1) 2024.11.04
'일기장/항해99클럽 4기' 카테고리의 다른 글
  • 99클럽 코테 스터디 12일차 TIL: 3차원 BFS
  • 99클럽 코테 스터디 11일차 TIL: 골드 너비 우선 탐색
  • 99클럽 코테 스터디 9일차 TIL: 재귀 함수로 구현하는 그래프
  • 99클럽 코테 스터디 8일차 TIL: 그래프 탐색 및 DP
미역굳
미역굳
.
  • 미역굳
    BE THE DEVELOPER
    미역굳
  • 전체
    오늘
    어제
    • TOTAL (60)
      • 안내 데스크 (1)
      • Google 공간 (3)
        • 프로젝트 트랙 1기 (3)
      • 자유공간 (9)
        • 임시학습실 (2)
        • 중앙 회의실 (5)
        • 알고리즘 연구실 (2)
      • 일기장 (47)
        • 우아한테크코스 7기 (12)
        • 항해99클럽 4기 (35)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    7기
    리뷰어
    코드잇 JavaScript 프론트엔드 개발자
    코딩테스트준비
    solved.ac
    99클럽
    항해99
    fixed
    파이썬
    Til
    백준 1000문제
    timeval
    우아한테크코스
    길벗
    cout.precision
    프리코스
    우테코
    코드잇 Python 풀스택 개발자
    수행 시간
    개발자취업
    코드잇 강의
    개발자
    백준
    오블완
    소수점 출력
    백준 스트릭
    코드잇
    티스토리챌린지
    백준 문제 출제
    스트릭
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
미역굳
99클럽 코테 스터디 10일차 TIL: 다익스트라
상단으로

티스토리툴바