λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⭐ Problem_Solving/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] μˆœμœ„ (Python/파이썬)

by ν¬μŠ€νŠΈμ‰μ΄ν¬ 2023. 2. 9.

<문제 링크>

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

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

<풀이 μ „λž΅>

1. μ–Έλœ» 보면 μœ„μƒμ •λ ¬ κ°™μ•„ λ³΄μ΄λŠ”λ° μˆœμœ„κ°€ ν™•μ •λœ μ„ μˆ˜λ“€μ˜ μˆœμœ„λ§Œ λ°˜ν™˜ν•΄μ•Όν•˜λ―€λ‘œ μœ„μƒμ •λ ¬λ‘œλŠ” ν’€ 수 μ—†λ‹€.

2. ν”Œλ‘œμ΄λ“œ-μ™€μƒ¬λ‘œ ν‘Ό μ‚¬λžŒλ“€λ„ λ§Žμ•˜λŠ”λ° κ·Έλƒ₯ dfs둜 ν‘ΈλŠ” 게 더 κ°„λ‹¨ν•˜λ‹€

3. μˆœμœ„κ°€ ν™•μ •λ˜μ–΄μžˆλ‹€λŠ” 것은 μžμ‹ μ˜ μœ„(μžμ‹  κΈ°μ€€ 승자)와 μ•„λž˜ (μžμ‹  κΈ°μ€€ 패자)λ₯Ό λͺ¨λ‘ μ•ˆ λ‹€λŠ” κ²ƒμ΄λ―€λ‘œ, μŠΉμžμ™€ 패자 κ·Έλž˜ν”„ 2개λ₯Ό λ§Œλ“€μ–΄μ„œ 각각에 λŒ€ν•΄ dfsλ₯Ό μ μš©ν•΄μ„œ νŒŒμ•…λœ μŠΉμžμ™€ 패자의 합이 μžμ‹ μ„ μ œμ™Έν•œ 전체 인원 μˆ˜μ™€ κ°™μœΌλ©΄ μˆœμœ„κ°€ ν™•μ •λ˜μ—ˆλ‹€κ³  λ³Ό 수 μžˆλ‹€.

 

<μ •λ‹΅ μ½”λ“œ>

# dfs ν•¨μˆ˜ μ„ μ–Έ
def dfs(node, graph, visited):

    visited[node] = 1
    
    for next in graph[node]:

        if visited[next]:
            continue

        visited[next] = 1
        dfs(next, graph, visited)

    # λ°©λ¬Έν•œ λ…Έλ“œ (승자 or 패자) 수 λ°˜ν™˜
    return sum(visited) - 1


def solution(n, results):

    answer = 0

    # 승자, 패자 κ·Έλž˜ν”„
    win_graph = [[] for _ in range(n + 1)]
    lose_graph = [[] for _ in range(n + 1)]

    for result in results:
        win, lose = result

        win_graph[win].append(lose)
        lose_graph[lose].append(win)


    # 각 λ…Έλ“œμ— λŒ€ν•΄μ„œ dfs둜 νŒŒμ•…λœ μŠΉμžμ™€ 패자 수 κ΅¬ν•˜κΈ°
    for i in range(1, n + 1):

        # μžμ‹  λ°‘μœΌλ‘œ 패자의 수
        visited = [0 for _ in range(n + 1)]
        win_cnt = dfs(i, win_graph, visited)

        # μžμ‹  μœ„λ‘œ 승자의 수
        visited = [0 for _ in range(n + 1)]
        lose_cnt = dfs(i, lose_graph, visited) 

        # μˆœμ„œκ°€ ν™•μ •λ‚œ 경우 
        if win_cnt + lose_cnt == n - 1:
            answer += 1


    return answer

 

λŒ“κΈ€