300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준
- AI
- 코딩테스트
- 파이썬
- 코딩 테스트
- CSS
- 딥러닝
- linux
- DFS
- 동적 프로그래밍
- 그래프
- 순열
- kick start
- 네트워크
- 킥스타트
- dp
- 운영체제
- 동적프로그래밍
- 프로그래머스
- 프로그래밍
- 리눅스
- 코딩
- 알고리즘
- 구글 킥스타트
- PYTHON
- nlp
- 브루트포스
- google coding competition
- BFS
- OS
Archives
- Today
- Total
오뚝이개발자
징검다리 건너기 본문
728x90
300x250
문제
https://programmers.co.kr/learn/courses/30/lessons/64062
나의 풀이
그냥 문제에서 주어진 대로 1명이 지나갈 때마다 디딤돌의 수에서 -1 해주면 O(n^2)으로 시간초과가 난다. 문제의 주어진 조건에서 보면 디딤돌의 수는 1이상 200000000이하의 자연수이므로 정답의 범위는 1이상 200000000이하라는걸 알 수 있다. (모든 디딤돌 수가 200000000이면 200000000명이 건널 수 있으니까)
이처럼 선형자료의 탐색을 할 때는 시간을 줄이기 위해 이분탐색을 사용하면 좋다.
- l, r 을 각각 1과 200000000으로 초기화 시킨 뒤 이분탐색을 한다.
- 여기서 탐색하는 수가 정답으로 return할 최대로 건널 수 있는 학생의 수이다.
- 각 mid값마다 0이하의 수가 연속으로 k개가 되는지를 검사한다.
- 만약 0이하의 수 k개가 연속된다면 r = mid-1을 해주고, 아니라면 l = mid + 1을 해준다.
코드
import copy
def solution(stones, k):
l,r = 1, 200000000
while l<=r:
mid = (l+r)//2
tmp = copy.deepcopy(stones)
for i in range(len(tmp)):
tmp[i] -= mid
cnt = 0
flag = 0
for i in range(len(tmp)):
if tmp[i] > 0:
cnt = 0
else:
cnt += 1
if cnt == k:
flag = 1
break
if flag == 1:
r = mid - 1
else:
l = mid + 1
return l
728x90
300x250
Comments