Skip to content

Commit 204f122

Browse files
committed
codetree.ai 삼성전자 2025 하반기 오전 1번 문제 택배 하차
문제 링크: https://www.codetree.ai/ko/frequent-problems/all/problems/delivery-service
1 parent f20c405 commit 204f122

6 files changed

Lines changed: 183 additions & 0 deletions

File tree

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
class Box:
2+
def __init__(self, k, h, w, c):
3+
self.k = k
4+
self.h = h
5+
self.w = w
6+
self.c = c
7+
self.sr, self.sc = 0, c
8+
9+
self.rcs = []
10+
for r in range(h):
11+
for c in range(w):
12+
self.rcs.append([r, c])
13+
14+
15+
def clear_box(board, block):
16+
for r in range(block.sr, block.sr + block.h):
17+
for c in range(block.sc, block.sc + block.w):
18+
board[r][c] = 0
19+
20+
21+
def draw_box(board, block):
22+
for r, c in block.rcs:
23+
nr, nc = block.sr + r, block.sc + c
24+
board[nr][nc] = block.k
25+
26+
27+
# 택배박스가 위에서 아래로 떨어지는 함수
28+
def move_down(board, block, N):
29+
movable = True
30+
31+
for sr in range(block.sr, N + 1):
32+
for r, c in block.rcs:
33+
nr, nc = sr + r, block.sc + c
34+
if board[nr][nc] != 0:
35+
movable = False
36+
break
37+
38+
if movable:
39+
block.sr = sr
40+
continue
41+
else:
42+
break
43+
44+
draw_box(board, block)
45+
46+
47+
def is_left_zero(board, box, N):
48+
for r in range(box.sr, box.sr + box.h):
49+
if sum(board[r][1:box.c]) == 0:
50+
continue
51+
else:
52+
return False
53+
54+
return True
55+
56+
57+
def is_right_zero(board, box, N):
58+
for r in range(box.sr, box.sr + box.h):
59+
local_begin = box.c + box.w
60+
local_length = (N + 1) # - (box.c + box.w)
61+
if sum(board[r][local_begin:local_length]) == 0:
62+
continue
63+
else:
64+
return False
65+
66+
return True
67+
68+
69+
def solve():
70+
N, M = map(int, input().split())
71+
board = []
72+
for _ in range(N):
73+
board.append([-1] + [0] * N + [-1])
74+
board.append([-1] * (N + 2))
75+
boxes = dict()
76+
orders = []
77+
78+
for _ in range(M):
79+
deleted_k, h, w, c = map(int, input().split())
80+
boxes[deleted_k] = Box(deleted_k, h, w, c)
81+
move_down(board, boxes[deleted_k], N)
82+
orders.append(deleted_k)
83+
84+
left_right = True
85+
86+
while len(boxes) > 0:
87+
candidates = []
88+
# 택배 하차 (좌측)
89+
if left_right:
90+
left_right = False
91+
92+
for key in orders:
93+
if is_left_zero(board, boxes[key], N):
94+
candidates.append(key)
95+
96+
# 택배 하차 (우측)
97+
else:
98+
left_right = True
99+
100+
for key in orders:
101+
if is_right_zero(board, boxes[key], N):
102+
candidates.append(key)
103+
104+
candidates.sort()
105+
deleted_k = candidates[0]
106+
print(deleted_k)
107+
clear_box(board, boxes[deleted_k])
108+
orders.remove(deleted_k)
109+
110+
del boxes[deleted_k]
111+
112+
for k in orders:
113+
box = boxes[k]
114+
clear_box(board, box)
115+
move_down(board, box, N)
116+
117+
118+
if __name__ == '__main__':
119+
solve()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
6 8
2+
1 2 1 3
3+
2 1 1 2
4+
6 2 2 1
5+
5 1 3 4
6+
4 2 2 5
7+
3 1 2 3
8+
8 2 4 1
9+
9 1 3 4
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2
2+
4
3+
3
4+
5
5+
6
6+
1
7+
8
8+
9
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
10 10
2+
5 8 2 7
3+
12 9 1 10
4+
13 1 2 4
5+
14 10 1 6
6+
19 1 1 9
7+
3 7 5 1
8+
6 1 1 4
9+
8 2 2 2
10+
9 1 1 8
11+
1 1 1 8
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
3
2+
1
3+
8
4+
12
5+
6
6+
9
7+
13
8+
19
9+
14
10+
5
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import sys
2+
from pathlib import Path
3+
from unittest import TestCase
4+
from main import solve
5+
6+
7+
class Test(TestCase):
8+
def my_solve(self, testcase_input):
9+
sys.stdin = open(testcase_input, 'r')
10+
stdout = sys.stdout
11+
sys.stdout = open('stdout.txt', 'w')
12+
solve()
13+
sys.stdout.close()
14+
sys.stdout = stdout
15+
16+
def test_solve(self, testcase_number: str):
17+
self.my_solve('test' + testcase_number + '.txt')
18+
self.assertEqual(
19+
Path('test' + testcase_number + '_answer.txt').read_text().strip(),
20+
Path('stdout.txt').read_text().strip())
21+
22+
def test1_solve(self):
23+
self.test_solve('1')
24+
25+
def test2_solve(self):
26+
self.test_solve('2')

0 commit comments

Comments
 (0)