File tree Expand file tree Collapse file tree
programmers/난이도별/level04.징검다리 Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11def 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
You can’t perform that action at this time.
0 commit comments