Skip to content

Commit

Permalink
sdsd
Browse files Browse the repository at this point in the history
  • Loading branch information
Dangtae committed Jun 2, 2024
1 parent 60a1f6f commit bf9db53
Show file tree
Hide file tree
Showing 2 changed files with 158 additions and 0 deletions.
52 changes: 52 additions & 0 deletions _posts/2024-06-03-level2-34.md
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에서 튜플을 기준으로 했을 때 맨 앞의 값을 기준으로 정렬한다
106 changes: 106 additions & 0 deletions _posts/2024-06-03-level2-35.md
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로 시작하여 재귀방식을통해 하나씩 늘려갔다

0 comments on commit bf9db53

Please sign in to comment.