2 ๋ถ„ ์†Œ์š”

๋ฌธ์ œ

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

๋ฌธ์ œ ์„ค๋ช…

๋„คํŠธ์›Œํฌ๋ž€ ์ปดํ“จํ„ฐ ์ƒํ˜ธ ๊ฐ„์— ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํ“จํ„ฐ A์™€ ์ปดํ“จํ„ฐ B๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๊ณ , ์ปดํ“จํ„ฐ B์™€ ์ปดํ“จํ„ฐ C๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ์ปดํ“จํ„ฐ A์™€ ์ปดํ“จํ„ฐ C๋„ ๊ฐ„์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํ“จํ„ฐ A, B, C๋Š” ๋ชจ๋‘ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์ƒ์— ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํ“จํ„ฐ์˜ ๊ฐœ์ˆ˜ n, ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด computers๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋„คํŠธ์›Œํฌ์˜ ๊ฐœ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ œํ•œ์‚ฌํ•ญ

  • ์ปดํ“จํ„ฐ์˜ ๊ฐœ์ˆ˜ n์€ 1 ์ด์ƒ 200 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ์ปดํ“จํ„ฐ๋Š” 0๋ถ€ํ„ฐย n-1์ธ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • i๋ฒˆ ์ปดํ“จํ„ฐ์™€ j๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด computers[i][j]๋ฅผ 1๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • computer[i][i]๋Š” ํ•ญ์ƒ 1์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

n computers return
3 [[1, 1, 0], [1, 1, 0], [0, 0, 1]] 2
3 [[1, 1, 0], [1, 1, 1], [0, 1, 1]] 1

๋‹ต์•ˆ

def DFS(n, computers, com, visited):
    if visited[com] == True:
        return
    visited[com] = True
    for connect in range(n):
        if connect != com and computers[com][connect] == 1:
            DFS(n, computers, connect, visited)

def solution(n, computers):
    answer = 0
    visited = [ False for _ in range(n)]
    for com in range(n):
        if visited[com] == False:
            DFS(n, computers, com, visited)
            answer += 1
    return answer

"""
# ๋ฐฑ์ค€์ด๋‚˜ ide์—์„œ ํ•  ๋•Œ
if __name__ == "__main__":
    n = 3
    computers = [[1, 1, 0], [1, 1, 0], [0, 0, 1]]
    print(solution(n, computers))  # 2
    n = 3
    computers = [[1, 1, 0], [1, 1, 1], [0, 1, 1]]
    print(solution(n, computers))  # 1
"""

ํ’€์ด

์šฐ์„  ๋ณดํ†ต์˜ ์™„์ „ํƒ์ƒ‰ ๋ฌธ์ œ๋Š” BFS, DFS ๋ชจ๋‘ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฒฐ๊ตญ ์™„์ „ํƒ์ƒ‰๋งŒ ํ•˜๋ฉด ๋์ด๋‹ˆ๊นŒ.

์ด ๋ฒˆ์—๋Š” DFS๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ดค๋‹ค. (๊ฒฐ๊ตญ ํ˜ผ์ž ํž˜์œผ๋กœ ํ’€์ง„ ๋ชปํ–ˆ๊ณ , ๋‹ต์•ˆ์„ ์ฐธ๊ณ ํ•จ.. ๊ณ„์† ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์‹ค๋ ฅ์„ ํ‚ค์›Œ๊ฐ€์ž)

ํ•˜์ง€๋งŒ ๋ณดํ†ต ์ตœ๋‹จ๊ฑฐ๋ฆฌ, ๋„คํŠธ์›Œํฌ ๋“ฑ์˜ ๋ฌธ์ œ ๋“ค์€ BFS๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค๊ณ  ์•Œ๊ณ ์žˆ๋‹ค.

BFS๋กœ๋„ ํ•ด๋ณด๊ธด ํ•จ.

์šฐ์„  DFS๋Š” ๊ฐ€์žฅ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๋‚˜์˜ค๋Š” ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์ธ๊ฑด ์•Œ๊ณ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋„คํŠธ์›Œํฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ๋„คํŠธ์›Œํฌ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์—ฌ๊ธฐ์„  ์ด๊ฑธ com์œผ๋กœ ํ–ˆ๋‹ค. (์‹œ์ž‘ computer๋ผ๋Š” ์˜๋ฏธ๋กœ)

๋™์ž‘ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

def DFS(n, computers, com, visited):
    if visited[com] == True:
        return
    visited[com] = True
    for connect in range(n):
        if connect != com and computers[com][connect] == 1:
            DFS(n, computers, connect, visited)
  1. ๋ฐฉ๋ฌธ๊ธฐ๋ก(visited)์—์„œ ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๊ฐ’์ด True์ด๋ฉด return (๋ฐฉ๋ฌธ์€ ํ•œ ๋ฒˆ๋งŒ ํ•˜๋ฏ€๋กœ, ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด ์žฌ๊ท€ ์ข…๋ฃŒ)
  2. ๋ฐฉ๋ฌธ๊ธฐ๋ก์— ์—†๋˜ ๋…ธ๋“œ๋ฉด True๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๋ณธ๊ฒฉ DFS ์‹œ์ž‘
  3. for connect in range(n)์œผ๋กœ ํ–ˆ๋Š”๋ฐ, ๋ณดํ†ต graph[node]๋ฅผ ์ˆœํšŒํ•˜๋”๋‹ˆ ์—ฌ๊ธฐ์„œ๋Š” ์™œ?
    • ๋ฌธ์ œ์—์„œ computers๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์คฌ๊ณ , ๊ฐ ์ปดํ“จํ„ฐ๋“ค์˜ ์ธ๋ฑ์Šค๊ฐ€ [0, 1, 2]๋‹ˆ๊นŒ range(3)์œผ๋กœ ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๊ธฐ ๋•Œ๋ฌธ์œผ๋กœ ์ดํ•ดํ•จ.
  4. ๋งŒ์•ฝ ์ˆœํšŒํ•˜๋Š” computer๊ฐ€ DFS๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ปดํ“จํ„ฐ์ธ com๊ณผ ๊ฐ™์ง€ ์•Š์•„์•ผ ํ•จ.
    • ๊ฐ๊ฐ์˜ ์ปดํ“จํ„ฐ๋Š” ์Šค์Šค๋กœ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ. ์ฆ‰, (0, 0), (1, 1), (2, 2)๋Š” ์–ด์ฐจํ”ผ 1์ž„ (ํ™•์ธํ•  ํ•„์š” ์—†์Œ)
  5. computers[com][connect] == 1์ด๋ฉด
    • 1์ด๋ฉด ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๊ฑฐ๋‹ˆ๊นŒ ์ฒดํฌ
  6. 4, 5๋ฒˆ ์กฐ๊ฑด ๋™์‹œ์— ๋งŒ์กฑํ•˜๋ฉด, DFS๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•จ.
def solution(n, computers):
    answer = 0
    visited = [ False for _ in range(n)]
    for com in range(n):
        if visited[com] == False:
            DFS(n, computers, com, visited)
            answer += 1
    return answer
  • ์—ฌ๊ธฐ์„œ๋Š” visited๋ฅผ ์„ ์–ธํ•˜๊ณ 
  • for ๋ฌธ์œผ๋กœ ์ˆœํšŒ๋ฅผ ํ•˜๋ฉฐ DFS๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ..
  • DFS๋Š” ์žฌ๊ท€๋กœ ๋™์ž‘ํ•˜๋‹ˆ๊นŒ, ์ด DFS๊ฐ€ ๋™์ž‘์ด ๋๋‚˜๋ฉด answer์„ 1์ฆ๊ฐ€ ์‹œํ‚ค๋ฉด ๋จ.

ํšŒ๊ณ 

  • answer += 1 ๋ถ€๋ถ„์ด ์‚ฌ์‹ค ์ œ์ผ ์ดํ•ด ์•ˆ๋๋˜ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ž„.
  • BFS์˜ ํ’€์ด๋„ ๋ด์•ผํ•จ..!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ