728x90
🔗 Problem Link
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
❔Thinking
- 사이클을 이루는 도넛모양 그래프, 한줄로 이어진 막대 그래프, 동일한 도넛 모양 2개가 이어진 8자 모양 그래프의 각 개수를 반환한다.
- 그래프를 이루는 정점 이외에 하나의 생성점이 각 그래프와 연결되어 있고, 이 생성점도 찾아 반환한다.
💻Solution
from collections import defaultdict, deque
def solution(edges):
answer = [0, 0, 0, 0]
start, donut, bar, eight = 0, 1, 2, 3
graph = defaultdict(list)
# 0: 진출, 1: 진입
degrees = defaultdict(lambda: [0, 0])
for edge in edges:
a, b = edge
graph[a].append(b)
degrees[a][0] += 1
degrees[b][1] += 1
for node, degree in degrees.items():
outd, ind = degree
if outd == 0:
answer[bar] += 1
elif outd == 2:
if ind > 0:
answer[eight] += 1
else:
answer[start] = node
root = node
elif outd > 2:
answer[start] = node
root = node
answer[donut] = degrees[root][0] - answer[bar] - answer[eight]
return answer
🗝️keypoint
- 각 그래프에서 유일하게 등장하는 정점의 특징을 파악하고, 그 특징으로 해당 그래프의 개수를 확인한다.
- 막대 그래프 : 마지막 정점은 진입 차수 = 1, 진출 차수 = 0이다.
- 8자 모양 그래프 : 진출 차수 = 2, 진입 차수 0 이상이다.
- 도넛 모양 그래프 : 생성점에서의 진출 차수 (=총 그래프 개수)에서 다른 두 그래프의 수를 빼면 구할 수 있다.
- defaultdict는 key값을 매번 확인하지 않더라도 dict에 값을 저장할 수 있고, lambda를 활용해 특정 구조를 만들 수 있다.
'코딩테스트 > Python' 카테고리의 다른 글
[Baekjoon] 2294. 동전 2 (0) | 2025.02.13 |
---|---|
[Programmers] Level. 숫자 블록 (0) | 2025.02.11 |
[Baekjoon] 2565. 전깃줄 (0) | 2025.02.11 |
[Programmers] Level 2. 충돌위험 찾기 (0) | 2025.02.09 |
[Baekjoon] 2573. 빙산 (0) | 2025.02.07 |