Skip to content

Commit 0963f0d

Browse files
authored
Merge pull request #140 from learntosurf/main
Learntosurf / 2์›” 2์ฃผ์ฐจ / 5๋ฌธ์ œ
2 parents a1700b5 + 740638e commit 0963f0d

5 files changed

+238
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import sys
2+
import heapq
3+
from collections import defaultdict
4+
input = sys.stdin.readline
5+
INF = int(1e9)
6+
7+
def dijkstra(start, graph, n):
8+
D = [INF] * (n+1)
9+
D[start] = 0
10+
q = []
11+
heapq.heappush(q, (0, start)) # (๊ฑฐ๋ฆฌ, ๋…ธ๋“œ)
12+
13+
while q:
14+
dist, now = heapq.heappop(q) # ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋…ธ๋“œ ๊บผ๋‚ด๊ธฐ
15+
16+
if D[now] < dist: # ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
17+
continue
18+
19+
for val, next_node in graph[now]: # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ํƒ์ƒ‰
20+
cost = dist + val
21+
if cost < D[next_node]: # ๋” ์งง์€ ๊ฒฝ๋กœ ๋ฐœ๊ฒฌ ์‹œ
22+
D[next_node] = cost
23+
heapq.heappush(q, (cost, next_node))
24+
25+
return D
26+
27+
# ์ž…๋ ฅ ์ฒ˜๋ฆฌ
28+
N, M, X = map(int, input().split())
29+
graph = defaultdict(list)
30+
reverse_graph = defaultdict(list)
31+
32+
for _ in range(M):
33+
start, end, time = map(int, input().split())
34+
graph[start].append((time, end)) # ๋‹จ๋ฐฉํ–ฅ ๋„๋กœ
35+
reverse_graph[end].append((time, start)) # X์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€๋น„
36+
37+
# X์—์„œ ๋ชจ๋“  ๋งˆ์„๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ (X -> ๋ชจ๋“  ๋งˆ์„)
38+
to_X = dijkstra(X, graph, N)
39+
40+
# ๋ชจ๋“  ๋งˆ์„์—์„œ X๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ (๋ชจ๋“  ๋งˆ์„ -> X) -> ์—ญ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ์‚ฌ์šฉ
41+
from_X = dijkstra(X, reverse_graph, N)
42+
43+
# ์™•๋ณต ์‹œ๊ฐ„ ๊ณ„์‚ฐ
44+
max_time = 0
45+
for i in range(1, N+1):
46+
if i == X:
47+
continue # X์—์„œ ์ถœ๋ฐœํ•˜๋Š” ํ•™์ƒ์€ ์ œ์™ธ
48+
max_time = max(max_time, to_X[i] + from_X[i])
49+
50+
print(max_time)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import sys
2+
input = sys.stdin.readline
3+
import heapq
4+
5+
# ๋ฐฉํ–ฅ ๋ฒกํ„ฐ (์ƒ, ํ•˜, ์ขŒ, ์šฐ)
6+
dx = [-1, 1, 0, 0]
7+
dy = [0, 0, -1, 1]
8+
9+
def dijkstra(N, cave):
10+
INF = float('inf')
11+
dist = [[INF] * N for _ in range(N)]
12+
13+
# ์šฐ์„ ์ˆœ์œ„ ํ (์†์‹ค ๋ฃจํ”ผ, x, y)
14+
pq = []
15+
heapq.heappush(pq, (cave[0][0], 0, 0))
16+
dist[0][0] = cave[0][0]
17+
18+
while pq:
19+
rupee, x, y = heapq.heappop(pq)
20+
21+
# ๋ชฉ์ ์ง€ ๋„์ฐฉ ์‹œ ์ข…๋ฃŒ
22+
if x == N - 1 and y == N - 1:
23+
return rupee
24+
# ํ˜„์žฌ ์ €์žฅ๋œ ์ตœ์†Œ ๋น„์šฉ๋ณด๋‹ค ํฌ๋ฉด ๋ฌด์‹œ
25+
if rupee > dist[x][y]:
26+
continue
27+
for i in range(4):
28+
nx, ny = x + dx[i], y + dy[i]
29+
30+
if 0 <= nx < N and 0 <= ny < N:
31+
new_cost = rupee + cave[nx][ny]
32+
if new_cost < dist[nx][ny]:
33+
dist[nx][ny] = new_cost
34+
heapq.heappush(pq, (new_cost, nx, ny))
35+
36+
case_num = 1
37+
38+
while True:
39+
N = int(input().strip())
40+
if N == 0:
41+
break
42+
cave = [list(map(int, input().split())) for _ in range(N)]
43+
result = dijkstra(N, cave)
44+
print(f"Problem {case_num}: {result}")
45+
case_num += 1
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import sys
2+
input = sys.stdin.readline
3+
import heapq
4+
5+
N, K = map(int, input().split()) # ๋ณด์„ ๊ฐœ์ˆ˜, ๊ฐ€๋ฐฉ ๊ฐœ์ˆ˜
6+
jewels = [tuple(map(int, input().split())) for _ in range(N)] # (๋ณด์„ ๋ฌด๊ฒŒ, ๋ณด์„ ๊ฐ€๊ฒฉ)
7+
bags = [int(input()) for _ in range(K)] # ๊ฐ€๋ฐฉ ๋ฌด๊ฒŒ
8+
9+
# ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
10+
jewels.sort()
11+
bags.sort()
12+
13+
max_heap = []
14+
total_v = 0
15+
j = 0
16+
17+
for bag in bags:
18+
# ํ˜„์žฌ ๊ฐ€๋ฐฉ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ณด์„์„ ํž™์— ์ถ”๊ฐ€
19+
while j < N and jewels[j][0] <= bag:
20+
heapq.heappush(max_heap, -jewels[j][1]) # ๊ฐ€๊ฒฉ์„ ์Œ์ˆ˜๋กœ ์ €์žฅ
21+
j +=1
22+
# ํ˜„์žฌ ๊ฐ€๋ฐฉ์—์„œ ๊ฐ€์žฅ ๋น„์‹ผ ๋ณด์„์„ ์„ ํƒ
23+
if max_heap:
24+
total_v += -heapq.heappop(max_heap) # ์Œ์ˆ˜๋กœ ์ €์žฅํ•œ ๊ฐ’ ๋˜๋Œ๋ฆฌ๊ธฐ
25+
26+
print(total_v)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
N = int(input())
5+
A = [list(map(int, input().split())) for _ in range(N)] # NxN ๊ฒฉ์ž
6+
7+
# ๋ฐฉํ–ฅ: ์ขŒ -> ํ•˜ -> ์šฐ -> ์ƒ
8+
directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]
9+
10+
# ๋ชจ๋ž˜ ์ด๋™ ๋น„์œจ (์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•  ๋•Œ ๊ธฐ์ค€)
11+
sand_ratio = [
12+
(-1, 1, 0.01), (1, 1, 0.01),
13+
(-1, 0, 0.07), (1, 0, 0.07),
14+
(-2, 0, 0.02), (2, 0, 0.02),
15+
(-1, -1, 0.10), (1, -1, 0.10),
16+
(0, -2, 0.05),
17+
(0, -1, 'alpha') # a: ๋‚จ์€ ๋ชจ๋ž˜๋ฅผ ๋†“์„ ์œ„์น˜
18+
]
19+
20+
out_sand = 0 # ๊ฒฉ์ž ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ„ ๋ชจ๋ž˜์˜ ์–‘
21+
22+
# ์ฃผ์–ด์ง„ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ (dx, dy)๋ฅผ ํšŒ์ „
23+
def rotate_dir(dx, dy, dir):
24+
for _ in range(dir):
25+
dx, dy = dy, -dx # 90๋„ ํšŒ์ „
26+
return dx, dy
27+
28+
# ๋ชจ๋ž˜๋ฅผ ํ˜„์žฌ ์œ„์น˜ (x,y)์—์„œ dir ๋ฐฉํ–ฅ์œผ๋กœ ํผ๋œจ๋ฆผ
29+
def spread_sand(x, y, dir):
30+
global out_sand
31+
total_sand = A[x][y] # ํ˜„์žฌ ์œ„์น˜์˜ ๋ชจ๋ž˜ ์–‘
32+
spread_sum = 0 # ํฉ๋‚ ๋ฆฐ ๋ชจ๋ž˜ ์ดํ•ฉ
33+
A[x][y] = 0 # ํ˜„์žฌ ์œ„์น˜ ๋ชจ๋ž˜๋ฅผ ๋จผ์ € ์—†์• ์คŒ
34+
35+
for dx, dy, ratio in sand_ratio:
36+
if ratio == 'alpha': # a ์œ„์น˜์ผ ๋•Œ ์ฒ˜๋ฆฌ
37+
continue
38+
# ํ˜„์žฌ ๋ฐฉํ–ฅ(dir)์— ๋งž๊ฒŒ ํšŒ์ „ ์ ์šฉ
39+
nx, ny = rotate_dir(dx, dy, dir) # ํšŒ์ „ ์ ์šฉ
40+
nx, ny = x + dx, y + dy # ์ด๋™ ์ขŒํ‘œ ๊ณ„์‚ฐ
41+
sand = int(total_sand * ratio) # ์†Œ์ˆ˜์  ๋ฒ„๋ฆผ
42+
43+
if 0 <= nx < N and 0 <= ny < N:
44+
A[nx][ny] += sand # ๊ฒฉ์ž ๋‚ด์— ์žˆ์œผ๋ฉด ๋”ํ•˜๊ธฐ
45+
else:
46+
out_sand += sand # ๊ฒฉ์ž ๋ฐ–์ด๋ฉด ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ„ ๋ชจ๋ž˜์— ์ถ”๊ฐ€
47+
48+
spread_sum += sand # ํฉ๋‚ ๋ฆฐ ๋ชจ๋ž˜ ์ดํ•ฉ ์ฆ๊ฐ€
49+
50+
# ๋‚จ์€ ๋ชจ๋ž˜๋ฅผ a ์œ„์น˜์— ๋ฐฐ์น˜
51+
dx, dy = rotate_dir(sand_ratio[-1][0], sand_ratio[-1][1], dir)
52+
alpha_x, alpha_y = x + dx, y + dy
53+
remaining_sand = total_sand - spread_sum # ๋‚จ์€ ๋ชจ๋ž˜ ๊ณ„์‚ฐ
54+
55+
if 0 <= alpha_x < N and 0 <= alpha_y < N:
56+
A[alpha_x][alpha_y] += remaining_sand
57+
else:
58+
out_sand += remaining_sand # ๊ฒฉ์ž ๋ฐ–์ด๋ฉด ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ„ ๋ชจ๋ž˜์— ์ถ”๊ฐ€
59+
60+
61+
x, y = N // 2, N // 2 # ์‹œ์ž‘์œ„์น˜ (์ค‘์•™)
62+
steps = 1 # ์ด๋™๊ฑฐ๋ฆฌ
63+
dir = 0 # ๋ฐฉํ–ฅ ์ธ๋ฑ์Šค (0:์ขŒ, 1:ํ•˜, 2:์šฐ, 3:์ƒ)
64+
65+
while (x, y) != (0, 0): # (1,1)๊นŒ์ง€ ์ด๋™
66+
for _ in range(2): # ๊ฐ™์€ step ํฌ๊ธฐ๋กœ ๋‘ ๋ฒˆ ์ด๋™ (์ขŒ->ํ•˜, ์šฐ->์ƒ)
67+
for _ in range(steps):
68+
x += directions[dir][0]
69+
y += directions[dir][1]
70+
71+
spread_sand(x, y, dir) # ๋ชจ๋ž˜ ํผ๋œจ๋ฆฌ๊ธฐ
72+
73+
if x == 0 and y == 0: # (1,1) ๋„์ฐฉํ•˜๋ฉด ์ข…๋ฃŒ
74+
break
75+
76+
dir = (dir + 1) % 4 # ๋ฐฉํ–ฅ ๋ณ€๊ฒฝ
77+
78+
steps += 1 # step ํฌ๊ธฐ ์ค‘๊ฐ€
79+
80+
print(out_sand)
81+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import sys
2+
input = sys.stdin.readline
3+
import heapq
4+
5+
N, Hcenti, T = map(int, input().split())
6+
giants = [-int(input().strip()) for _ in range(N)] # ์ตœ๋Œ€ ํž™์„ ์œ„ํ•ด ์Œ์ˆ˜ ๋ณ€ํ™˜
7+
8+
# ์ตœ๋Œ€ ํž™ ์ƒ์„ฑ
9+
heapq.heapify(giants)
10+
used_hammer = 0 # ์‚ฌ์šฉํ•œ ๋ฟ…๋ง์น˜ ํšŸ์ˆ˜
11+
12+
# ๋งˆ๋ฒ•์˜ ๋ฟ…๋ง์น˜๋ฅผ ์‚ฌ์šฉ
13+
for _ in range(T):
14+
tallest = -heapq.heappop(giants) # ๊ฐ€์žฅ ํฐ ๊ฑฐ์ธ ์ถ”์ถœ
15+
16+
if tallest < Hcenti: # ์„ผํ‹ฐ๋ณด๋‹ค ์ž‘์•„์กŒ๋‹ค๋ฉด ์ข…๋ฃŒ
17+
heapq.heappush(giants, -tallest)
18+
break
19+
20+
if tallest == 1: # ํ‚ค๊ฐ€ 1์ด๋ฉด ์ค„์ผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค์‹œ ๋„ฃ๊ณ  ์ข…๋ฃŒ
21+
heapq.heappush(giants, -tallest)
22+
break
23+
24+
new_height = tallest // 2 # ํ‚ค ์ค„์ด๊ธฐ
25+
heapq.heappush(giants, -new_height) # ์ค„์ธ ๊ฐ’ ๋‹ค์‹œ ์‚ฝ์ž…
26+
used_hammer += 1 # ์‚ฌ์šฉ ํšŸ์ˆ˜ ์ฆ๊ฐ€
27+
28+
# ๊ฐ€์žฅ ํ‚ค๊ฐ€ ํฐ ๊ฑฐ์ธ ํ™•์ธ (ํž™์ด ๋น„์—ˆ์œผ๋ฉด 0)
29+
tallest_remaining = -heapq.heappop(giants) if giants else 0
30+
31+
if tallest_remaining < Hcenti:
32+
print("YES")
33+
print(used_hammer)
34+
else:
35+
print("NO")
36+
print(tallest_remaining)

0 commit comments

Comments
ย (0)