https://school.programmers.co.kr/learn/courses/30/lessons/258711
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 풀이
이 문제는 각 노드와 각 그래프의 특징을 빠르게 파악해서 그래프를 찾는 것이 중요하다.
- '생성된 정점'은 나가는 간선의 수가 2 이상이고, 들어오는 간선의 수가 0이다.
- '막대 모양 그래프'의 수는 나가는 간선의 수가 0, 들어오는 간선의 수가 1인 노드의 개수와 같다.
- '8자 모양 그래프'의 수는 나가는 간선의 수가 2, 들어오는 간선의 수도 2인 노드의 개수와 같다.
- '도넛 모양 그래프'는 '생성된 정점'의 나가는 간선의 수에서 막대 모양 그래프와 8자 모양 그래프의 개수를 빼서 구한다.
- 이때, 막대 모양 그래프와 8자 모양 그래프의 경우 '생성된 정점'에서 들어오는 간선이 존재하므로 각각 1 이상, 2 이상으로 조건을 설정한다.
이러한 규칙을 찾은 후, 주어진 간선 리스트를 통해
1. 노드마다 들어오는 간선 수, 나가는 간선 수 계산하기
2. 위에서 구해진 간선 수 리스트를 통해 생성한 정점, 막대 그래프, 8자 모양 그래프, 도넛 모양 그래프 를 찾아야 한다.
코드 구현
def solution(edges):
def count_edges(edges):
# 각 노드별로 간선의 수를 추가할 딕셔너리
# 딕셔너리 value = 나가는 간선 수, 들어오는 간선 수
edge_counts = {}
# a에서 b로 향하는 간선
for a,b in edges:
# 간선들 순회하면서 딕셔너리에 없으면 value 추가해주기
if not edge_counts.get(a):
edge_counts[a] = [0,0]
if not edge_counts.get(b):
edge_counts[b] = [0,0]
edge_counts[a][0] += 1
edge_counts[b][1] += 1
return edge_counts
def check_answer(edge_counts):
answer = [0,0,0,0]
for key, counts in edge_counts.items():
# 생성된 정점
if counts[0] >= 2 and counts[1] == 0:
answer[0] = key
# 막대 모양 그래프
elif counts[0] == 0 and counts[1] >= 1:
answer[2] += 1
# 8자 모양 그래프
elif counts[0] == 2 and counts[1] >= 2:
answer[3] += 1
# 도넛 모양 그래프
answer[1] = edge_counts[answer[0]][0] - answer[2] - answer[3]
return answer
edge_counts = count_edges(edges)
answer = check_answer(edge_counts)
return answer
이렇게 풀었더니 런타임 에러가 많이 떠서 추후에 고쳐보려고 한다.
런타임 에러를 해결하신 분의 글도 참고에 올려놓겠다.
참고
이 글은 카카오 인턴십 코딩테스트를 2일 앞두고 빠르게 기출을 풀기 위해 연습해본 글이다.
구현 방법을 바로 생각하는게 어려워서 다른 글을 참고하며 직접 구현해 보았다.
[Programmers/Python] 도넛과 막대그래프
도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프들이 있습니다. 이 그래프들은 1개 이상의 정점과, 정점들을 연결하는 단방향 간선으로 이루어져 있습니다.
velog.io
https://s5unnyjjj.tistory.com/81
[홀로 하는 코딩 공부] 도넛과 막대 그래프(Python)
프로그래머스 사용 언어: Python 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/258711 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프
s5unnyjjj.tistory.com
'코딩테스트' 카테고리의 다른 글
[프로그래머스] [python] 스택/큐 - 기능개발 (0) | 2025.03.07 |
---|---|
[프로그래머스] [Python] 스택/큐 - 같은 숫자는 싫어 (0) | 2025.03.07 |
[프로그래머스] [python] 과제 진행하기 (0) | 2025.02.25 |
[프로그래머스] [python] 크기가 작은 부분 문자열 (0) | 2025.02.25 |
[프로그래머스] [python] 연속된 부분 수열의 합 : 투 포인터 알고리즘 (0) | 2025.01.07 |