Skip to content

Commit 5bfeb1e

Browse files
committed
Solved: 3020 개똥벌레
1 parent 8ac30d3 commit 5bfeb1e

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

jaykxo/week08/3020_개똥벌레.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# 3020 개똥벌레
2+
# Python3, 메모리: 71968 KB, 시간: 436 ms
3+
# PyPy3, 메모리: 118544 KB, 시간: 144 ms
4+
5+
import sys
6+
input = sys.stdin.readline
7+
8+
N, H = map(int, input().split())
9+
10+
# 석순과 종유석의 길이 빈도를 저장할 배열
11+
# 인덱스 = 장애물의 길이, 값 = 해당 길이 장애물 개수
12+
# +2 여유 공간은 인덱스 범위 오류 방지용
13+
down = [0] * (H + 2) # 석순(바닥에서 위로)
14+
up = [0] * (H + 2) # 종유석(천장에서 아래로)
15+
16+
# 장애물 길이 입력 받기
17+
for i in range(N):
18+
L = int(input())
19+
if i % 2 == 0:
20+
# 짝수 번째는 석순
21+
down[L] += 1
22+
else:
23+
# 홀수 번째는 종유석
24+
up[L] += 1
25+
26+
# 누적합으로 변환
27+
# down[h] = 높이 h 이상인 석순의 개수
28+
# up[h] = 길이 h 이상인 종유석의 개수
29+
# → 뒤에서부터 누적해야 “길이 이상(≥)” 형태의 합
30+
for h in range(H - 1, 0, -1):
31+
down[h] += down[h + 1]
32+
up[h] += up[h + 1]
33+
34+
# 각 높이 h(1 ~ H)에서의 충돌 개수 계산
35+
min_hit = N + 1 # 최소 충돌 횟수: 초기값 충분히 크게 설정
36+
count_min = 0 # 최소 충돌이 발생하는 높이 개수
37+
38+
for h in range(1, H + 1):
39+
# 석순은 높이 h 이상일 때 충돌
40+
# 종유석은 천장에서 내려오므로 (H - h + 1) 이상일 때 충돌
41+
hit = down[h] + up[H - h + 1]
42+
43+
# 최솟값 갱신
44+
if hit < min_hit:
45+
min_hit = hit
46+
count_min = 1 # 새 최솟값이 나왔으니 개수 1로 초기화
47+
elif hit == min_hit:
48+
count_min += 1 # 같은 최솟값이 또 나왔으니 개수 +1
49+
50+
print(min_hit, count_min)

0 commit comments

Comments
 (0)