Skip to content

Commit c1ff59b

Browse files
committed
[level 3] Title: 표현 가능한 이진트리, Time: 232.14 ms, Memory: 17.8 MB -BaekjoonHub
1 parent dbbb79a commit c1ff59b

2 files changed

Lines changed: 156 additions & 0 deletions

File tree

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# [level 3] 표현 가능한 이진트리 - 150367
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/150367)
4+
5+
### 성능 요약
6+
7+
메모리: 17.8 MB, 시간: 232.14 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2023 KAKAO BLIND RECRUITMENT
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 10월 21일 16:31:33
20+
21+
### 문제 설명
22+
23+
<p>당신은 이진트리를 수로 표현하는 것을 좋아합니다.</p>
24+
25+
<p>이진트리를 수로 표현하는 방법은 다음과 같습니다.</p>
26+
27+
<ol>
28+
<li>이진수를 저장할 빈 문자열을 생성합니다.</li>
29+
<li>주어진 이진트리에 더미 노드를 추가하여 포화 이진트리로 만듭니다. <strong>루트 노드는 그대로 유지합니다.</strong></li>
30+
<li>만들어진 포화 이진트리의 노드들을 가장 왼쪽 노드부터 가장 오른쪽 노드까지, 왼쪽에 있는 순서대로 살펴봅니다. <strong>노드의 높이는 살펴보는 순서에 영향을 끼치지 않습니다.</strong></li>
31+
<li>살펴본 노드가 더미 노드라면, 문자열 뒤에 0을 추가합니다. 살펴본 노드가 더미 노드가 아니라면, 문자열 뒤에 1을 추가합니다.</li>
32+
<li>문자열에 저장된 이진수를 십진수로 변환합니다.</li>
33+
</ol>
34+
35+
<p><strong>이진트리에서 리프 노드가 아닌 노드는 자신의 왼쪽 자식이 루트인 서브트리의 노드들보다 오른쪽에 있으며, 자신의 오른쪽 자식이 루트인 서브트리의 노드들보다 왼쪽에 있다고 가정합니다.</strong></p>
36+
37+
<p>다음은 이진트리를 수로 표현하는 예시입니다.</p>
38+
39+
<p>주어진 이진트리는 다음과 같습니다.<br>
40+
<img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/c3331b5f-2151-4ebd-a20e-8df122709d3e/%E1%84%8C%E1%85%A6%E1%84%86%E1%85%A9%E1%86%A8%20%E1%84%8B%E1%85%A5%E1%86%B9%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%83%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7.drawio%20%284%29.png" title="" alt="제목 없는 다이어그램.drawio \(4\).png"></p>
41+
42+
<p>주어진 이진트리에 더미노드를 추가하여 포화 이진트리로 만들면 다음과 같습니다. <strong>더미 노드는 점선으로 표시하였고, 노드 안의 수는 살펴보는 순서를 의미합니다.</strong><br>
43+
<img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/0eb238be-9bfe-479a-bed8-84e1abe63097/%E1%84%8C%E1%85%A6%E1%84%86%E1%85%A9%E1%86%A8%20%E1%84%8B%E1%85%A5%E1%86%B9%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%83%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7.drawio%20%285%29.png" title="" alt="제목 없는 다이어그램.drawio \(5\).png"></p>
44+
45+
<p>노드들을 왼쪽에 있는 순서대로 살펴보며 0과 1을 생성한 문자열에 추가하면 <code>"0111010"</code>이 됩니다. 이 이진수를 십진수로 변환하면 58입니다. </p>
46+
47+
<p>당신은 수가 주어졌을때, 하나의 이진트리로 해당 수를 표현할 수 있는지 알고 싶습니다.</p>
48+
49+
<p>이진트리로 만들고 싶은 수를 담은 1차원 정수 배열 <code>numbers</code>가 주어집니다. <code>numbers</code>에 주어진 순서대로 하나의 이진트리로 해당 수를 표현할 수 있다면 1을, 표현할 수 없다면 0을 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해주세요.</p>
50+
51+
<hr>
52+
53+
<h5>제한사항</h5>
54+
55+
<ul>
56+
<li>1 ≤ <code>numbers</code>의 길이 ≤ 10,000
57+
58+
<ul>
59+
<li>1 ≤ <code>numbers</code>의 원소 ≤ 10<sup>15</sup></li>
60+
</ul></li>
61+
</ul>
62+
63+
<hr>
64+
65+
<h5>입출력 예</h5>
66+
<table class="table">
67+
<thead><tr>
68+
<th><code>numbers</code></th>
69+
<th><code>result</code></th>
70+
</tr>
71+
</thead>
72+
<tbody><tr>
73+
<td>[7, 42, 5]</td>
74+
<td>[1, 1, 0]</td>
75+
</tr>
76+
<tr>
77+
<td>[63, 111, 95]</td>
78+
<td>[1, 1, 0]</td>
79+
</tr>
80+
</tbody>
81+
</table>
82+
<hr>
83+
84+
<h5>입출력 예 설명</h5>
85+
86+
<p><strong>입출력 예 #1</strong></p>
87+
88+
<p>7은 다음과 같은 이진트리로 표현할 수 있습니다.<br>
89+
<img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/f7e1fdb9-3344-420d-9238-e033a24e83ba/%E1%84%8C%E1%85%A6%E1%84%86%E1%85%A9%E1%86%A8%20%E1%84%8B%E1%85%A5%E1%86%B9%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%83%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7.drawio%20%287%29.png" title="" alt="제목 없는 다이어그램.drawio \(7\).png"></p>
90+
91+
<p>42는 다음과 같은 이진트리로 표현할 수 있습니다.<br>
92+
<img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/f7e1fdb9-3344-420d-9238-e033a24e83ba/%E1%84%8C%E1%85%A6%E1%84%86%E1%85%A9%E1%86%A8%20%E1%84%8B%E1%85%A5%E1%86%B9%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%83%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7.drawio%20%287%29.png" title="" alt="제목 없는 다이어그램.drawio \(7\).png"></p>
93+
94+
<p>5는 이진트리로 표현할 수 없습니다.</p>
95+
96+
<p>따라서, [1, 0]을 return 하면 됩니다.</p>
97+
98+
<p><strong>입출력 예 #2</strong></p>
99+
100+
<p>63은 다음과 같은 이진트리로 표현할 수 있습니다.<br>
101+
<img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/ae334397-6cf6-4cb7-a76e-f760c080def3/%E1%84%8C%E1%85%A6%E1%84%86%E1%85%A9%E1%86%A8%20%E1%84%8B%E1%85%A5%E1%86%B9%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%83%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7.drawio%20%288%29.png" title="" alt="제목 없는 다이어그램.drawio \(8\).png"></p>
102+
103+
<p>111은 다음과 같은 이진트리로 표현할 수 있습니다.<br>
104+
<img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/b6873b5d-421c-433e-a739-97f9ab1b62b8/%E1%84%8C%E1%85%A6%E1%84%86%E1%85%A9%E1%86%A8%20%E1%84%8B%E1%85%A5%E1%86%B9%E1%84%82%E1%85%B3%E1%86%AB%20%E1%84%83%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%8B%E1%85%A5%E1%84%80%E1%85%B3%E1%84%85%E1%85%A2%E1%86%B7.drawio%20%2810%29.png" title="" alt="제목 없는 다이어그램.drawio \(10\).png"></p>
105+
106+
<p>95는 이진트리로 표현할 수 없습니다.</p>
107+
108+
<p>따라서, [1, 1, 0]을 return 하면 됩니다.</p>
109+
110+
111+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import Foundation
2+
3+
// 어떤 정상적인 포화 이진트리에 대해, 루트가 반드시 존재하므로 1이다.
4+
// 루트의 오른쪽 서브트리들이 더미여도, 루트의 순서에 의해 해당 더미노드들이 보존된다.
5+
// 따라서 왼쪽에 패딩한다.
6+
7+
func solution(_ numbers:[Int64]) -> [Int] {
8+
var answer = [Int]()
9+
10+
for number in numbers {
11+
let binary = String(number, radix: 2)
12+
13+
var fullSize = 1
14+
// 포화 이진트리의 노드 수는 2^k - 1
15+
while fullSize - 1 < binary.count {
16+
fullSize *= 2
17+
}
18+
fullSize -= 1
19+
20+
let pad = String(repeating: "0", count: fullSize - binary.count)
21+
let binTree = Array(pad + binary)
22+
let isVailidTree = isValidTree(binTree)
23+
answer.append(isVailidTree == true ? 1 : 0)
24+
}
25+
26+
return answer
27+
}
28+
29+
func isValidTree(_ s: [Character]) -> Bool {
30+
if s.count == 1 { return true } // leaf node
31+
32+
let mid = s.count / 2
33+
let root = s[mid]
34+
let left = Array(s[..<mid])
35+
let right = Array(s[(mid + 1)...])
36+
37+
if root == "0" {
38+
// 루트가 0이면 자식도 모두 0이어야 함
39+
if left.contains("1") || right.contains("1") {
40+
return false
41+
}
42+
}
43+
// 양쪽 서브트리도 각각 검사
44+
return isValidTree(left) && isValidTree(right)
45+
}

0 commit comments

Comments
 (0)