본문 바로가기
Python/알고리즘문제

[프로그래머스] 등대

by 붕어사랑 티스토리 2022. 12. 26.
반응형

해설

  • 노드가 N개인데 N-1개로 모두 연결되어있다 => 트리구조
  • 트리를 만든다.
  • 트리에서 가장 끝의 리프는 불을 키지 않는다.
  • 자식노드가 모두 불이 꺼져있으면 불을킨다
  • 자식노드가 하나라도 불이꺼져있으면 불을 킨다

 

 

처음에 루트노드를 무조건 자식이 2개 이상인걸로 잡았다.

그런데 다시 문제를 풀어보니 루트노드는 아무거나 잡아도 상관없어서 1로 맘편하게 했다

from collections import deque
import sys
sys.setrecursionlimit(10**9)
class Tree:
    def __init__(self,num):
        self.num = num
        self.childs = []
        self.parentNode = None       
    def printChilds(self):
        result = ""
        for i in self.childs:
            result += str(i.num)+" "
        print(self.num)
        print(result if result != "" else "none")

def getRootNode(n, adj):
    rootNode = None
    for i in range(1, n+1):
        if len(adj[i]) > 1:
            return Tree(i)
    if rootNode is None:
        return Tree(1)

def makeTree(n, adj, rootNode):
    q = deque()
    q.append(rootNode)
    visit = [False] *(n+1)
    while q:
        node = q.popleft()
        now = node.num
        if visit[now]:
            continue
        visit[now] = True
        for near in adj[now]:
            if not visit[near]:
                childNode = Tree(near)
                node.childs.append(childNode)
                q.append(childNode)
        #node.printChilds()

class answerObserver:
    def __init__(self):
        self.answer = 0

def dfs(node, observer):
    if len(node.childs) == 0:
        return False
    isTurnOn = True
    
    for child in node.childs:
        isTurnOn &= dfs(child,observer)
        
    isTurnOn = not isTurnOn
    if isTurnOn:
        observer.answer+=1
        #print(node.num,"은 켜야됨")
    return isTurnOn
    
    
def solution(n, lighthouse):
    adj = [[] for _ in range(n+1)]
    for A,B in lighthouse:
        adj[A].append(B)
        adj[B].append(A)
    #rootNode = getRootNode(n, adj)
    rootNode=Tree(1)
    makeTree(n, adj, rootNode)
    observer = answerObserver()
    dfs(rootNode,observer)
    return observer.answer
반응형

'Python > 알고리즘문제' 카테고리의 다른 글

[프로그래머스] 사칙연산  (0) 2022.12.28
[백준 2042] 구간 합 구하기  (0) 2022.12.27
[알고스팟] 소풍  (0) 2022.12.21
[알고스팟] 보글게임  (0) 2022.12.21
[알고스팟] 록 페스티벌  (0) 2022.12.20

댓글