땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • I
  • 이것이 리눅스다 with Rocky Linux9
  • E
  • D
  • ㅗ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 1068 트리(DFS)

2022. 7. 10. 18:11

https://www.acmicpc.net/problem/1068

 

1068번: 트리

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다

www.acmicpc.net

DFS를 이용하여 방문처리를 해준다음 풀어나가는 문제였다.

처음에 접근한 방식은 2중 그래프를 만들어서 각각 숫자에 누가 연결되어있는지 판단한 다음에

-1이 root node이기 때문에 -1부터 시작해서 DFS를 돌리고 len(graph[temp]) == 0일 때 자식노드가 없다는 것으로 판단하고 풀었는데 완전히 잘못된 생각이였다.

반례)

4 
-1 0 1 2 
2

처럼 모두 일직선으로 연결되어있는 트리를 보면 2에서 자르게 되면 1이 리프노드가 되어 답은 1이 되어야하는데 내가 짠 코드대로 해버리면 부모노드까지 잘라버려서 이상한 값이 나온다.

 

문제를 읽어보면 주어진 숫자의 의미는 내 부모노드가 어떤 숫자인지 가르쳐준다는 의미이다.

즉 주어진 숫자들은 어떤 i라는 숫자의 부모노드가 되야하기 때문에 리프노드가 될 수 없다

먼저 숫자들에 대해서 DFS를 돌릴껀데 k부터는 모두 없어져야하니까 k에 연결된 모든 것들은 연산에 영향을 미치지 않는 새로운 값으로 대입해준다.

 

즉, dfs(k, arr)를 해서 arr[k] = -2를 해주고 그 부모노드가 k인 node에 대해서 다시 DFS를 돌린다

 

이렇게 되면 최종적으로 k에 대한 제거가 끝나고 최종 array가 남을텐데

 

array에 0부터 len(array)까지 array에 포함되지 않은 수를 찾으면 된다.

why?)

array에 적힌 값은 어떤 수 i에 대한 부모노드가 적힌 리스트인데 0,1,2,...,len(arr)-1까지의 숫자들 중

예를들어 1이라고 하면 1이 array에 없다는건 어떤 수 i가 1을 부모노드로 가지고 있지 않다!

라는 것이고 즉 다른말로 말하면 1은 자식노드가 없다는 것이기 때문에 리프노드이다. 라는 것

 

import sys
input = sys.stdin.readline

def dfs(num, arr):
    arr[num] = -2
    for i in range(len(arr)):
        if num == arr[i]:
            dfs(i, arr)

n = int(input())
data = list(map(int, input().split()))
k = int(input())
res = 0

dfs(k, data)
for i in range(len(data)):
    if data[i] != -2 and i not in data:
        res += 1
print(res)

 

 

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 17406 배열 돌리기4(구현)  (0) 2022.08.12
백준 16206 롤케이크(그리디)  (0) 2022.07.12
백준 3079 입국심사(이분탐색)  (0) 2022.07.10
백준 2251 물통(BFS)  (0) 2022.07.03
백준 6236 용돈 관리(이분 탐색)  (0) 2022.07.03
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 17406 배열 돌리기4(구현)
    • 백준 16206 롤케이크(그리디)
    • 백준 3079 입국심사(이분탐색)
    • 백준 2251 물통(BFS)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바