forked from mmistakes/minimal-mistakes
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
158 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
--- | ||
layout: single | ||
title: "프로그래머스 LV2 - 배달" | ||
categories: CodingTest | ||
tag: [LV2, 프로그래머스, 코딩테스트, UNSOLVED] | ||
author_profile: false | ||
sidebar: | ||
nav: "counts" | ||
--- | ||
|
||
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/12978) | ||
|
||
|
||
## 풀이 | ||
|
||
```python | ||
import heapq | ||
|
||
def solution(N, road, K): | ||
graph = [[] for _ in range(N+1)] | ||
distance = [float('inf')] * (N+1) | ||
distance[1] = 0 | ||
|
||
for a, b, cost in road: | ||
graph[a].append((b,cost)) | ||
graph[b].append((a,cost)) | ||
|
||
|
||
heap = [] | ||
heapq.heappush(heap, (0,1)) | ||
while heap: | ||
dist , node = heapq.heappop(heap) | ||
for adj, weight in graph[node]: | ||
cost = dist + weight | ||
if cost < distance[adj]: | ||
distance[adj] = cost | ||
heapq.heappush(heap, (cost, adj)) | ||
|
||
answer = 0 | ||
for key in distance: | ||
if key <= K: | ||
answer += 1 | ||
|
||
return answer | ||
|
||
``` | ||
|
||
### 풀이 해석 | ||
- 다익스트라 알고리즘을 이용해서 거리를 갱신해나가는 코드 | ||
- heapq를 이용해서 while 문 돌 때마다 최소비용을 뽑아서 전개한다 | ||
- 다익스트라 알고리즘 구현할 때 heapq를 쓰는이유! | ||
- heapq에서 튜플을 기준으로 했을 때 맨 앞의 값을 기준으로 정렬한다 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
--- | ||
layout: single | ||
title: "프로그래머스 LV2 - 전력망 나누기" | ||
categories: CodingTest | ||
tag: [LV2, 프로그래머스, 코딩테스트, ONE MORE TIME] | ||
author_profile: false | ||
sidebar: | ||
nav: "counts" | ||
--- | ||
|
||
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/86971) | ||
|
||
|
||
## 내 풀이 | ||
|
||
```python | ||
# 전력망 네트워크를 모두 잘라보고 비교하여 가장 작은 차이 도출하기 | ||
# 본인 노드 기준 인접 노드를 저장 | ||
# 한쪽 탐색이 끝나면 n - 개수를 통해 반대쪽 갯수 도출 | ||
# wires를 for문을 돌며 자르고 for문을 다돌았을 때 가장 작은 차이 return | ||
# 최소 절댓값 선언해놓고 작을때마다 갱신 | ||
|
||
def count_tower(n, graph, node, visited): # 연결된 전력망 갯수 세는 함수 | ||
visited[node] = True | ||
for adj in graph[node]: | ||
if not visited[adj]: | ||
count_tower(n, graph, adj, visited) | ||
|
||
|
||
def solution(n, wires): | ||
# 인접 노드 정보 담을 graph | ||
graph = [[] for _ in range(n+1)] | ||
|
||
# 우선 전력망 정보 담기 | ||
for wire in wires: | ||
a, b = wire | ||
graph[a].append(b) | ||
graph[b].append(a) | ||
|
||
minimum = n # 전력망 차이 초기화 | ||
for wire in wires: # wire 하나씩 자르기 | ||
# 방문 정보 담기 | ||
visited = [False] * (n+1) | ||
a, b = wire | ||
|
||
# 전력망 자르기 | ||
graph[a].remove(b) | ||
graph[b].remove(a) | ||
count_tower(n, graph, 1, visited) # 1번노드 기준으로 계산 | ||
|
||
# 전력망 갯수 계산 | ||
count = sum(1 for visit in visted if visit == True) | ||
|
||
# 계산결과가 지금까지 최솟값 보다 작을경우 갱신 | ||
if abs(count-(n-count)) < minimum: | ||
minimum = abs(count-(n-count)) | ||
|
||
# 잘랐던 전력망 다시 이어붙이기 | ||
graph[a].append(b) | ||
graph[b].append(a) | ||
|
||
return minimum | ||
|
||
``` | ||
|
||
## 다른 풀이 | ||
```python | ||
def solution(n, wires): | ||
|
||
graph = [[] for _ in range(n + 1)] | ||
for a, b in wires: | ||
graph[a].append(b) | ||
graph[b].append(a) | ||
|
||
|
||
def dfs(node, parent): | ||
cnt = 1 | ||
for child in graph[node]: | ||
if child != parent: | ||
cnt += dfs(child, node) | ||
return cnt | ||
|
||
min_diff = float("inf") | ||
for a, b in wires: | ||
|
||
graph[a].remove(b) | ||
graph[b].remove(a) | ||
|
||
|
||
cnt_a = dfs(a, b) | ||
cnt_b = n - cnt_a | ||
|
||
|
||
min_diff = min(min_diff, abs(cnt_a - cnt_b)) | ||
|
||
graph[a].append(b) | ||
graph[b].append(a) | ||
|
||
return min_diff | ||
|
||
출처 - 코딩테스트 합격하기 | ||
``` | ||
|
||
### 풀이 해석 | ||
- DFS 알고리즘을 통해 나눠진 전력망의 갯수를 구하였다 | ||
- cnt를 1로 시작하여 재귀방식을통해 하나씩 늘려갔다 |