알고리즘 (PS)/Programmers

[프로그래머스] 도넛과 막대 그래프 (2024 KAKAO WINTER INTERNSHIP)

2024. 11. 22. 21:22
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/258711

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

생각보다 재미있게 푼 그래프 문제

백준 티어로 치면, 골드5 정도 될 것 같다.

 

막대 그래프 = 1자로 연결된 트리

도넛 그래프 = 사이클 1개인 그래프

8자 그래프 = 사이클이 2개인 그래프

 

이때 각각의 그래프를 식별할 수 있는 특징을 잡아내면 된다.

 

막대 그래프는 사이클이 없다.

도넛 그래프는 사이클이 존재하며, 모든 정점의 out degree 가 1개이다.

8자 그래프는 사이클이 존재하며, 1개 정점의 out degree = 2, 나머지 정점의 out degree = 2 이다.

 

또한 막대 그래프, 도넛 그래프, 8자 그래프를 서로 연결하는 임의의 정점은 자신으로 들어오는 indegree 는 없으면서 out degree는 최소 2인 정점이다. (문제 조건상 막대 그래프, 도넛 그래프, 8자 그래프는 최소 2개 존재한다고 했기 때문이다. 막대 그래프의 시작 정점과 구분할 수 있도록 하기 위해서 이런 조건을 추가한 것 같다.)

 

따라서 다음과 같은 흐름으로 문제를 풀었다.

 

1. 모든 그래프를 연결하는 중간 정점 찾기

이 정점은 in degree = 0, out degree > 1 인 정점이다.

 

2. 중간 정점에서 시작하여 DFS 돌리기

이때 각 DFS 결과로 이 DFS를 시작한 정점이 속한 그래프에 사이클이 있는지, 그 그래프의 최대 out degree 개수는 몇 개 인지 센다.

만약 사이클이 없다면 막대 그래프이고, 사이클이 있는데 out degree의 최대 개수가 1개면 도넛 그래프, 2개면 8자 그래프이다.

 

DFS 결과로 각각의 그래프를 카운팅해서 정답 배열에 추가해주면 된다.

 

주의할 점은 파이썬의 경우, 재귀 깊이가 최대 100만까지 갈 수 있으므로 sys.setrecursionlimit 을 통해 제한을 늘려주어야 한다.

 

import sys
sys.setrecursionlimit(10**6)

visit = [False]*1000001
graph = [[] for _ in range(1000001)]
in_deg = [0]*(1000001)
out_deg = [0]*(1000001)

def DFS(node):
    visit[node] = True
    cycle = False
    max_out_deg = out_deg[node]
    for conn_node in graph[node]:
        if visit[conn_node]:
            cycle = True
        else:
            sub_max_out_deg, sub_cycle = DFS(conn_node)
            cycle = cycle or sub_cycle
            max_out_deg = max(max_out_deg, sub_max_out_deg)
    return max_out_deg, cycle


def solution(edges):
    # 도넛 = 사이클
    # 막대 = 트리
    # 8자 = 2개 사이클
    # 시작하는 정점은 나가는 간선이 2개 이상
    # 시작하는 정점은 들어오는 간선이 반드시 0개
    for start, end in edges:
        graph[start].append(end)
        out_deg[start] += 1
        in_deg[end] += 1

    start_node = 0
    for node in range(1, 1000001):
        if in_deg[node] == 0 and out_deg[node] > 1:
            start_node = node
            break

    g1, g2, g3 = 0, 0, 0
    for next_node in graph[start_node]:
        max_out_deg, cycle = DFS(next_node)
        if not cycle:
            g2 += 1
        elif max_out_deg == 2:
            g3 += 1
        else:
            g1 += 1

    answer = [start_node, g1, g2, g3]
    return answer
반응형
저작자표시 비영리 변경금지

'알고리즘 (PS) > Programmers' 카테고리의 다른 글

[프로그래머스] 이중우선순위큐  (0) 2025.03.22
[프로그래머스] 시험장 나누기 (2021 카카오 채용연계형 인턴십)  (0) 2025.03.21
[프로그래머스] 길 찾기 게임 (2019 KAKAO BLIND RECRUITMENT)  (0) 2025.03.20
[프로그래머스/python3] 다트 게임 (2018 KAKAO BLIND RECRUITMENT [1차])  (0) 2022.11.13
'알고리즘 (PS)/Programmers' 카테고리의 다른 글
  • [프로그래머스] 이중우선순위큐
  • [프로그래머스] 시험장 나누기 (2021 카카오 채용연계형 인턴십)
  • [프로그래머스] 길 찾기 게임 (2019 KAKAO BLIND RECRUITMENT)
  • [프로그래머스/python3] 다트 게임 (2018 KAKAO BLIND RECRUITMENT [1차])
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
에버듀
Blog. 에버듀
에버듀
전체
오늘
어제
  • 분류 전체보기 (585) N
    • 개인 프로젝트 (43)
      • [2020] 카카오톡 봇 (9)
      • [2021] 코드악보 공유APP (22)
      • [2022] 유튜브 뮤직 클론코딩 (9)
      • 간단한 프로젝트 (3)
    • 팀 프로젝트 (22)
      • [2020] 인공지능 숫자야구 (4)
      • [2022] OSAM 온라인 해커톤 (10)
      • [2024] GDSC 프로젝트 트랙 (6)
      • [2025] 큰소리 웹 페이지 (2)
    • 알고리즘 (PS) (107)
      • BOJ (101)
      • Programmers (5)
      • 알고리즘 이모저모 (1)
    • CS (312)
      • 자료구조 (19)
      • 어셈블리 (41)
      • 멀티미디어응용수학 (7)
      • 컴퓨터 구조 (29)
      • 알고리즘 분석 (4)
      • 컴퓨터 네트워크 (38)
      • 프로그래밍언어론 (15)
      • HCI 윈도우즈프로그래밍 (26)
      • 기초데이터베이스 (29)
      • 운영체제 (23)
      • 오토마타 (24)
      • 문제해결기법 (11)
      • 블록체인 (22)
      • 소프트웨어공학 (12)
      • 기계학습심화 (12)
    • 자기계발 (35)
      • 동아리 (7)
      • 자격증 (2)
      • 코딩테스트, 대회 (8)
      • 생각 정리 (17)
      • 머니 스터디 (1)
    • WEB(BE) (5)
      • express.js (1)
      • flask (0)
      • Spring & Spring Boot (4)
    • WEB(FE) (2)
      • html, css, js (1)
      • React.js (1)
    • Tool & Language (6)
      • Edit Plus (1)
      • Git (1)
      • Python3 (2)
      • Java (2)
    • Infra (12)
      • AWS (1)
      • Oracle Cloud (8)
      • Firebase (2)
      • Network (1)
    • Android (18)
      • Java (6)
      • Flutter (12)
    • Window (2)
      • Visual Studio 없이 WPF (1)
      • MFC (1)
    • 독서 (12)
      • Inside Javascript (7)
      • Database Internals (4)
      • 한 글 후기 (1)
    • 인턴 (8)
      • 델파이 (7)
      • Oracle (1)

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.1.4
에버듀
[프로그래머스] 도넛과 막대 그래프 (2024 KAKAO WINTER INTERNSHIP)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.