728x90
Problem
그래프 / 가장 먼 노드
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Sol
1번 노드에서 가장 멀리 떨어진 노드의 개수를 구하는 문제
🌱 참고
그래프를 적절한 형태의 자료구조로 변환하고 생각해야 했던 문제였습니다. 아래 도서를 참고하여 공부했습니다.
Do it! 알고리즘 코딩 테스트: 파이썬 편
“코딩 테스트를 제대로 준비하려면 어떤 문제를 얼마나 풀어야 할까?” 곧 코딩 테스트를 앞둔 취업 또는 이직 준비생이라면 누구나 이런 고민을 할 것이다. 《Do it! 알고리즘 코딩 테스트 - 파이썬 편》에 그 답이 있다. 네이버, 카카오, 삼성, 라인 등 주요 IT 기업의 시험에 나오는 알고리즘 내용이 모두 담겨 있어 책 한 권만으로 코딩 테스트 합격에 필요한 지식을 충분히 공부할 수 있다. 책에 수록된 알고리즘 문제 100개는 모두 최신 기출 유형을 반영하고 있어서 이 책의 문제만 다 풀면 당장 코딩 테스트를 볼 수 있는 수준까지 실력을 갖출 수 있다. 모든 문제는 ‘분석, 전략, 슈도코드, 코드 구현’까지 총 4단계를 거쳐 푸는데, 이렇게 문제를 푸는 습관까지 자기 것으로 만든다면 진짜 시험에서 어떤 문제를 만나든 실수 없이 해결할 수 있을 것이다.
- 저자
- 김종관
- 출판
- 이지스퍼블리싱
- 출판일
- 2022.08.16
해결 방법
👀 그래프를 인접 리스트로 표현하고, BFS를 사용해 그래프를 탐색하였습니다. 탐색이 완료되면 node간 거리 distances중에서 제일 먼 거리를 가진 노드를 count할 수 있습니다. 그래프 생성 ➡️ BFS 탐색 ➡️ 최대 거리 계산
1. 그래프 -> 인접 리스트(adjacency list)
- n번 노드와 연결되어 있는 노드를 리스트(graph)의 index n에 append 하는 방식
- edge 'a', 'b' 양방향 연결
2. BFS 위한 거리 리스트(distances), queue 초기화
- distances : 각 노드의 거리 저장
- 방문하지 않은 노드의 distances를 -1 로 설정
- 1번 노드에서 출발하기 때문에 1번 거리 = 0
- queue에 1번 노드 넣은 상태로 BFS 시작
3. BFS 탐색 : 1번 노드로부터 모든 노드까지의 최단 거리 계산
- 너비 우선 탐색 - 가장 먼저 queue에 들어온 노드부터 탐색
- queue에서 노드를 하나씩 꺼낸 후 인접한 이웃(neighbor) 노드 탐색
- 방문되지 않았을 경우(-1) : 현재 노드의 거리 + 1 하고 queue에 추가
4. 가장 멀리 떨어진 노드 개수 count
- max_distance(저장된 distances) 중 최대값 을 count
시간복잡도 O(V+E)
- Vertex(그래프 노드수), Edge(간선 수)
- O(V) : 그래프의 모든 노드 방문, queue에 빼고 넣는 과정이 O(1)이기 때문에 가능
- O(E) : 모든 간선 검사, 인접 간선을 모두 검사하는데 드는 시간이 간선의 총 개수에 비례
✔ Answer
from collections import deque
def solution(n, edge):
# 1번 노드에서 가장 멀리 떨어진 노드의 개수
answer = 0
# 1. 그래프 -> 인접 리스트로
graph = [[] for _ in range(n+1)]
for a, b in edge:
graph[a].append(b)
graph[b].append(a)
# 2. BFS 위한 거리 리스트, 큐 초기화
distances = [-1] * (n + 1) # not visited 상태
distances[1] = 0 # 1번 노드
queue = deque([1])
while queue:
current = queue.popleft()
for neighbor in graph[current]:
if distances[neighbor] == -1: # not visited 노드
distances[neighbor] = distances[current] + 1
queue.append(neighbor)
# 3. 가장 멀리 떨어진 노드 개수
max_distance = max(distances)
answer = distances.count(max_distance)
return answer
💬 소감
문제가 갑자기 너무 어려워진 느낌이었습니다. 공부를 더 해야겠구나 다시 한번 느꼈습니다...
'TIL > Algorithm' 카테고리의 다른 글
[99클럽 코테 스터디 26일차 TIL] ㅣLeetCode | 1476. Subrectangle Queries (0) | 2024.06.14 |
---|---|
[99클럽 코테 스터디 25일차 TIL] 프로그래머스 | 순위 (1) | 2024.06.13 |
[99클럽 코테 스터디 23일차 TIL] LeetCode | 1011. Capacity To Ship Packages Within D Days (1) | 2024.06.11 |
[99클럽 코테 스터디 22일차 TIL] 프로그래머스 | 입국심사 (0) | 2024.06.10 |
[99클럽 코테 스터디 21일차 TIL] LeetCode | 1277. Count Square Submatrices with All Ones (0) | 2024.06.09 |