Skip to content

Commit 4032906

Browse files
committed
2023 KAKAO BLIND RECRUITMENT 1,2,3 떨어트리기
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/150364
1 parent 0543227 commit 4032906

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from typing import List, Optional
2+
3+
4+
class Node:
5+
def __init__(self, node_num, target):
6+
self.num = node_num
7+
self.target = target
8+
self.children: List[Optional[Node]] = []
9+
self.idx_child = 0
10+
self.indexes123: List[int] = []
11+
12+
def send_num123(self, idx123):
13+
if len(self.children) == 0:
14+
self.indexes123.append(idx123)
15+
return not len(self.indexes123) > self.target
16+
17+
rtn = self.children[self.idx_child].send_num123(idx123)
18+
self.idx_child = (self.idx_child + 1) % len(self.children)
19+
return rtn
20+
21+
def __lt__(self, other):
22+
return self.num < other.num
23+
24+
25+
def num123_make_target(leaves):
26+
for idx in range(len(leaves)):
27+
if not len(leaves[idx].indexes123) <= leaves[idx].target <= len(leaves[idx].indexes123) * 3:
28+
return False
29+
30+
return True
31+
32+
33+
def make_target_from123(length123: int, target: int):
34+
num123 = 3
35+
answer = []
36+
37+
while target > 0:
38+
if length123 - 1 <= target - num123 <= (length123 - 1) * 3:
39+
answer.append(num123)
40+
target -= num123
41+
length123 -= 1
42+
else:
43+
num123 -= 1
44+
45+
answer.sort()
46+
return answer
47+
48+
49+
def solution(edges: List[List[int]], target: List[int]):
50+
nodes: List[Node] = [None for _ in range(101)]
51+
52+
for parent_num, child_num in edges:
53+
if nodes[parent_num] is None:
54+
nodes[parent_num] = Node(parent_num, target[parent_num - 1])
55+
if nodes[child_num] is None:
56+
nodes[child_num] = Node(child_num, target[child_num - 1])
57+
58+
nodes[parent_num].children.append(nodes[child_num])
59+
60+
leaves: List[Node] = []
61+
62+
for node_num in range(101):
63+
if nodes[node_num]:
64+
if len(nodes[node_num].children) > 0:
65+
nodes[node_num].children.sort()
66+
else:
67+
leaves.append(nodes[node_num])
68+
69+
idx123 = 0
70+
while True:
71+
if False == nodes[1].send_num123(idx123):
72+
return [-1]
73+
74+
idx123 += 1
75+
76+
if num123_make_target(leaves):
77+
break
78+
79+
answer = [0] * idx123
80+
for leaf in leaves:
81+
ans = make_target_from123(len(leaf.indexes123), target[leaf.num - 1])
82+
ans.sort()
83+
for idx in range(len(leaf.indexes123)):
84+
answer[leaf.indexes123[idx]] = ans[idx]
85+
86+
return answer
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from unittest import TestCase
2+
from main import solution
3+
4+
5+
class Test(TestCase):
6+
def test1_solution(self):
7+
self.assertEqual([1, 1, 2, 2, 2, 3, 3], solution([[2, 4], [1, 2], [6, 8], [1, 3], [5, 7], [2, 5], [3, 6], [6, 10], [6, 9]], [0, 0, 0, 3, 0, 0, 5, 1, 2, 3]))
8+
9+
def test2_solution(self):
10+
self.assertEqual([1, 1, 3, 2, 3], solution([[1, 2], [1, 3]], [0, 7, 3]))
11+
12+
def test3_solution(self):
13+
self.assertEqual([-1], solution([[1, 3], [1, 2]], [0, 7, 1]))

0 commit comments

Comments
 (0)