Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- Python
- 맵
- DFS
- 문자열
- boj
- 13164
- 싸피
- 그래프
- SSAFY
- 이분 탐색
- 누적 합
- 슬라이딩 윈도우
- DP
- 수학
- 그리디
- 세그먼트 트리
- JavaScript
- 모던 JavaScript 튜토리얼
- BFS
- 트리
- 정수론
- 애드 혹
- 구현
- 투 포인터
- 해시 테이블
- 정렬
- 2357
- 플로이드-워셜
- 브루트포스
- 에라토스테네스의 체
Archives
- Today
- Total
흙금이네 블로그
[BOJ] 22856 - 트리 순회 (Python, JavaScript) 본문
아이디어
각 노드의 자식 수를 구하되, 해당 노드가 왼쪽 서브 트리의 노드라면 1을 추가로 더한다.
풀이 #1 (Python)
중위 순회의 마지막 노드는 트리에서 가장 오른쪽에 있는 노드이다.
따라서 유사 중위 순회 방법에 따라 왼쪽 서브 트리에 속하는 노드는 모두 부모 노드로 이동하게 된다.
DFS로 왼쪽 서브 트리에 속하는 노드는 자식 수+1, 나머지 노드는 자식 수를 결과값에 더해 나간다.
import sys
sys.setrecursionlimit(100002)
input = sys.stdin.readline
def solution():
def traversal(u, is_right):
nonlocal res
res += child[u]+1-is_right
if tree[u][0] > 0:
traversal(tree[u][0], 0)
if tree[u][1] > 0:
traversal(tree[u][1], is_right)
N = int(input())
tree = [[-1]*2 for _ in range(N+1)]
child = [0]*(N+1)
for _ in range(N):
a, b, c = map(int, input().split())
tree[a][0] = b
tree[a][1] = c
if b > 0:
child[a] += 1
if c > 0:
child[a] += 1
res = 0
traversal(1, 1)
print(res)
solution()
풀이 #2 (Python)
왼쪽 서브 트리에 속하지 않는 노드는 루트 노드를 제외한 모든 조상 노드가 오른쪽 서브 트리에 속해야 한다.
따라서 반복문으로 루트 노드의 오른쪽 자식 노드부터 차례로 오른쪽 자식 노드를 순회하며 그 개수를 결과값에서 뺀다.
import sys
input = sys.stdin.readline
def solution():
N = int(input())
res = -1
right_child = [-1]*(N+1)
for _ in range(N):
a, b, c = map(int, input().split())
res += 1
if b > 0:
res += 1
if c > 0:
res += 1
right_child[a] = c
u = 1
while right_child[u] > 0:
u = right_child[u]
res -= 1
print(res)
solution()
풀이 #3 (JavaScript)
풀이 #2와 마찬가지 방식으로 동작한다.
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
function solution() {
const N = Number(input[0]);
let res = -1;
let rightChild = Array(N+1).fill(0);
for (let i=1; i<=N; i++) {
const [a, b, c] = input[i].split(' ').map(Number);
res += 1;
if (b > 0) res += 1;
if (c > 0) {
res += 1;
rightChild[a] = c;
}
}
let u = 1;
while (rightChild[u] > 0) {
u = rightChild[u];
res -= 1;
}
console.log(res);
}
solution();
'알고리즘' 카테고리의 다른 글
[BOJ] 2412 - 암벽 등반 (Python, JavaScript) (0) | 2023.05.07 |
---|---|
[BOJ] 11265 - 끝나지 않는 파티 (Python, JavaScript) (0) | 2023.05.06 |
[BOJ] 1477 - 휴게소 세우기 (Python) (0) | 2023.05.04 |
[BOJ] 1270 - 전쟁 - 땅따먹기 (Python) (0) | 2023.05.03 |
[BOJ] 1563 - 개근상 (Python) (0) | 2023.05.03 |
Comments