Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- 파이썬
- Laravel
- 99클럽
- til
- 알고리즘
- 코테
- 코딩테스트준비
- vue
- 코테 파이썬
- 라라벨
- 티스토리챌린지
- 뷰
- 개발자취업
- 파이썬 코테
- Python
- DP
- 플러터
- 코딩테스트
- flutter getx
- Flutter
- ML
- 백준
- 오블완
- 항해99
- 안드로이드
- 코딩테스트 준비
- C++
- react
- 개발자 취업
- c++ 코테
Archives
- Today
- Total
잡다로그
[Python/코테] 백준 2644 촌수 계산 | 무방향 그래프 구현하기 본문
2644 촌수 계산
문제 및 조건 설명: https://www.acmicpc.net/problem/2644


알고리즘 설계
💡idea.

- 입력값에 따라 트리를 만들고, 노드 간의 거리를 구하는 것으로 간단하게 이해할 수 있다. (왼쪽 사진 참고)
- 깊이 우선 탐색인 DFS를 사용한다. BFS를 사용할 수도 있다.
🎲step.
- 입력 값을 이차원 배열에 저장하여 그래프 구조를 구현한다.
- 시작 노드에서 출발하여 연결된 노드를 탐색하는 DFS를 진행한다. 방문 표시(거리 계산)할 리스트를 만들고 시작 노드를 0으로 초기화한다.
- 두번째 노드에 도착하면, 시작 노드에 1을 더해 거리가 1임을 표시한다.
세번째 노드에 도착하면, 직전 노드에 1을 더해 시작 노드로부터의 거리를 표시한다. - 최종적으로 찾기 원하는 노드의 값을 출력한다.
알고리즘 구현
import sys
from collections import deque
n = int(input())
start, end = map(int, input().split())
k = int(input())
family = [[] for _ in range(n+1)]
visited = [False] * (n+1)
for _ in range(k):
input = sys.stdin.readline().split()
# 무방향 그래프
family[int(input[0])].append(int(input[1]))
family[int(input[1])].append(int(input[0]))
def dfs(start):
stack = deque()
stack.append(start)
visited[start] = 0
while stack:
node = stack.pop()
for next in family[node]:
if not visited[next]:
visited[next] = visited[node] + 1
if next == end:
break
else:
stack.append(next)
result = dfs(start)
if visited[end] > 0:
print(visited[end])
else:
print(-1)
나다어
- 두 노드 사이의 거리를 구하기 위해서 깊이 우선 탐색을 사용했다. DFS는 스택을 사용한다.
- 거리를 구할 때는 노드에 도착할 때마다 기존 노드+1을 해주는 것으로 구현 가능하다.
파이썬에서 그래프 자료 구조 구현하기

무방향 그래프와 방향 그래프 두 가지가 있지만, 기본적이고 문제에서 사용되었던 무방향 그래프에 대해서만 확인해보자.
그래프는 왼쪽과 같이 인접 행렬로 표현할 수 있다. 각 정점 i와 j가 간선으로 연결되어 있으면 matrix[i][j] = 1, 아니면 0의 값을 가진다.
이 인접행렬을 사전 혹은 인접리스트로 구현할 수 있다. 사전일 때는 키값이 곧 정점의 값이 되고, 배열로 구현하면 인덱스가 정점의 값이 된다.
- 배열의 크기는 정점의 수와 같다.
- 배열의 각 인덱스는 그래프의 특정 정점을 나타낸다.
- 배열의 인덱스 i에 있는 값은 정점 i에 인접한 모든 정점을 포함하는 배열이다.
예를 들어, graph[0] 은 정점 0 에 연결된(이웃) 모든 노드를 갖는다.

예시로, 왼쪽의 그래프를 리스트로 구현하면 아래와 같다.
graph1 = [[], [2,3,5], [1,3], [1,2,4], [3,5], [1,4]] # 그림의 숫자를 맞추기 위해 0인덱스는 비워뒀다.
출처: https://wikidocs.net/196182
https://www.geeksforgeeks.org/graph-and-its-representations/
'Algorithm' 카테고리의 다른 글
| [Python/코테] 백준 1074 Z (0) | 2023.11.18 |
|---|---|
| [Python/코테] 백준 11729 하노이 탑 이동 순서 (0) | 2023.11.18 |
| [Python/코테] 백준 28471 W키가 빠진 성원이 (0) | 2023.11.14 |
| [Python/코테] 백준 4949 균형잡힌 세계 (0) | 2023.11.14 |
| [C++/코테] DFS (0) | 2023.11.13 |
Comments