티스토리 뷰
문제 설명
n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.
송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.
제한사항
n은 2 이상 100 이하인 자연수입니다.
wires는 길이가 n-1인 정수형 2차원 배열입니다.
wires의 각 원소는 [v1, v2] 2개의 자연수로 이루어져 있으며, 이는 전력망의 v1번 송전탑과 v2번 송전탑이 전선으로 연결되어 있다는 것을 의미합니다.
1 ≤ v1 < v2 ≤ n 입니다.
전력망 네트워크가 하나의 트리 형태가 아닌 경우는 입력으로 주어지지 않습니다.
언뜻 보기에 어려워 보이지만 그렇게 어려운 문제는 아닙니다. 약간 문제를 읽고 주어지는 입력값을 자세히 살펴본 뒤에 생각하면 그렇게 어렵게 느껴질 것은 없다고 생각합니다. 일단 저는 queue
로 풀었습니다. 문제에서 tree
라고 처음에 주어져서 트리 순회를 할까?
생각을 했었습니다. 근데 생각해보니, 어차피 입력값도 그렇게 많지도 않고
, 그냥 다 돌고 결정(완전탐색
)하는게 좋지 않을까 생각했어요. 그래서 방문 배열을 따로 만든 뒤에 모조리 queue에 넣고 순회
했습니다. 그리고 지금 문제에서 주어진 입력값을 보면 서로 연결되어 있다고만(송전선에서 알 수 있습니다) 말하고 있어요. 그러면 양방향
이라는 이야기니까. 순회를 돌릴 graph를 만들 때, 양방향으로 수정
해줘야한다는 것을 알 수 있습니다. 그래서 바로 문제를 풀 수 있었습니다. 어차피 트리이기 때문에, 모든 노드는 연결되어 있습니다. 이걸 활용하면서 짜른 2개의 영역 중 한쪽만 돌거에요. 노드의 개수를 알기 때문에 한쪽 개수만 알아도 나머지 한쪽은 바로 알 수 있습니다.
그러면 문제에서는 양쪽 영역의 노드의 개수가 가장 비슷할 때의 차이를 구해달라고 했기 때문에, 최대 영역의 개수와 최소 영역의 개수의 차이 중 최소값을 구하는 것
과 동일한 의미입니다. 풀이 ㄱ!
제가 풀이한 코드입니다.
from collections import deque
def solution(n, wires):
answer = 100000
graph = [[] for _ in range(n+1)] # 0번부터 노드가 시작되는 것이 아니기 때문에 +1추가해주기!
for s, e in wires: # 양방향이기 때문에 양쪽 모두 추가해주기
graph[s].append(e)
graph[e].append(s)
for node1, node2 in wires:
visited = [False for _ in range(n + 1)] # 모든 노드를 순회할 것이기 때문에 매 순회마다 방문 배열을 만들어줍니다
q = deque()
q.append(node1)
result = 1
visited[node1] = True # true를 넣어주는 이유는 여기서 시작할거니까요.
visited[node2] = True # 여기에 넣어주는 이유는 한쪽만 돌거에요.
while q:
node = q.popleft()
for ele in graph[node]:
if not visited[ele]:
result += 1
visited[ele] = True
q.append(ele)
# 여기서 최소값과 최대값을 구하고 업데이트합니다
min_value = min(result, n-result)
max_value = n - min_value
if answer > max_value - min_value:
answer = max_value - min_value
return answer
'알고리즘 > Programmers' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 in Python (0) | 2021.12.09 |
---|---|
[프로그래머스] 문자열 압축 in Python (0) | 2021.12.09 |
[프로그래머스] 위클리 챌린지, 전력망을 둘로 나누기 in Kotlin (0) | 2021.12.08 |
[프로그래머스] 피로도 in Python (0) | 2021.11.26 |
[프로그래머스] KAKAO 불량사용자 in Python (0) | 2021.11.12 |
- Total
- Today
- Yesterday
- 백준 #숨박꼭질3 #다익스트라 #알고리즘 #비전공개발자 #풀스택 #웹개발 #앱개발 #안드로이드 #python
- 프로그래머스
- Kotlin
- 비전공싸피합격
- 안드로이드
- 비전공개발자
- DP
- 백준알고리즘 #BFS #델타이동 #알고리즘풀이 #개발 #안전영역 #풀스택개발자가되고싶습니다. #노력할래요 # 꾸준히 # 화이팅! #비전공개발자
- 중첩클래스와 내부클래스
- 카카오
- 앱개발
- 싸피5기
- 기본생성자
- kotlin문법
- 생성자
- Python
- 코틀린
- Java
- 구간 합 구하기 4
- 프로젝트구조
- Programmers #알고리즘 #Python #KAKAOINTERNSHIP #비전공개발자 #불량사용자
- 추가합격후기
- 보조생성자
- 알고리즘
- 일반파라미터
- 안드로이드 #안드로이드스튜디오 #Kotlin #앱개발 #안드로이드기초 #비전공개발자 #풀스택개발자 #앱개발자
- 백준
- Java #객체지향 #상속 #생성자 #개념 #비전공개발자 #FullStack을 #향해
- 참조연산자
- Class
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |