Skip to content

Commit 59bda3a

Browse files
author
6047198844
committed
[programmers] 징검다리
1 parent 26bb593 commit 59bda3a

1 file changed

Lines changed: 35 additions & 19 deletions

File tree

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,56 @@
11
def solution(distance, rocks, n):
22
answer = 0
3-
4-
rocks.append(distance)
53
rocks.sort()
64

7-
begin = min(rocks)
5+
# 정답의 범위
6+
begin = 0
87
end = distance
98

10-
while begin < end:
11-
print(begin, end)
12-
min_distance = distance
9+
# print(rocks)
10+
while begin <= end:
11+
# 우리가 목표하는 거리
1312
mid = (begin + end) // 2
13+
# 현재 남아있는 바위의 위치
1414
stack = [0]
1515

1616
for rock in rocks:
1717
# 현재 거리와 stack위의 rock거리를 비교
18-
if rock - stack[-1] < mid:
18+
between = rock - stack[-1]
19+
if between < mid:
1920
# 제거해야한다.-> stack에 넣지 않는다.
20-
pass
21-
else:
22-
stack.append(rock)
23-
if stack[-1] - stack[-2] < min_distance:
24-
min_distance = stack[-1] - stack[-2]
25-
26-
# 삭제한 돌의 개수
27-
del_rock_n = len(rocks) - len(stack)
21+
continue
22+
stack.append(rock)
23+
24+
# 마지막돌과 도착지점의 거리를 계산한다.
25+
# 해당 거리가 우리가 목표하는바 보다 작다면 해당 돌을 제거한다.
26+
last_distance = distance - stack[-1]
27+
if last_distance < mid:
28+
stack.pop()
29+
stack.append(distance)
30+
31+
min_distance = distance
32+
33+
# 돌간 최소거리
34+
for idx in range(1, len(stack)):
35+
min_distance = min(min_distance, stack[idx] - stack[idx - 1])
36+
37+
# 삭제한 돌의 개수 (출발지점은 제외함)
38+
del_rock_n = len(rocks) - (len(stack) - 2)
2839
if del_rock_n <= n:
2940
# 삭제한 돌이 N보다 작은경우 -> 거리가 짧으므로 거리를 늘린다.
3041
# 삭제한 돌이 N인경우 -> 정답 갱신
31-
if del_rock_n == n:
32-
answer = min_distance
42+
answer = max(answer, min_distance)
3343
begin = mid + 1
3444
# 삭제한 돌이 N보다 큰경우 -> 거리가 기므로 거리를 좁힌다.
35-
elif del_rock_n > n:
45+
else:
3646
end = mid - 1
3747

38-
print(stack, answer)
48+
# print(stack,min_distance,del_rock_n)
49+
50+
'''
51+
0~25 m=12
52+
0~11 m=5
53+
0~4 m=2
54+
'''
3955

4056
return answer

0 commit comments

Comments
 (0)