티스토리 뷰
[문제]

디딤돌의 내구도와 한번에 건널 수 있는 디딤돌의 갯수가 주어졌을 때 최대 몇명이 건널 수 있는지 계산하는 문제 입니다.
입출력 예시 : stones = [2, 4, 5, 3, 2, 1, 4, 2, 5, 1], k = 3
[풀이]
1. 아주 간단한 방법:
한명씩 건넌다고 치고 stones의 모든 원소값을 1씩 빼고 다시한번 0이하의 값이 연속되는지 확인합니다.
하지만 이 방법은 2중 for문으로 n^2의 시간복잡도가 소요됩니다. 원소의 최대값은 2억이고, 배열의 크기의 최대값은 20만이므로
n^2의 방법으로는 1초안에 풀이가 불가능합니다.
2. 이진탐색법의 LogN의 시간복잡도를 활용
몇명이 건널 수 있는지가 문제이기때문에 몇명인지를 이진탐색으로 탐색해서 구해보면 빠르게 구할 수 있을거 같습니다.
가능한 최대로 건널 수 있는 사람의 수는 stones 원소의 최댓값입니다. (모든 디딤돌이 최댓값일 경우)
가능한 최소로 건널 수 있는 사람의 수는 stones 원소의 최솟값입니다. (모든 디딤돌이 최솟값일 경우)
따라서 min_v(left) = min(stones), min_v(right) = min(stones) 로 정해줍니다.
그리고 중간값 (mid_v = min_v + (min_v + max_v) // 2) 을 건널 수 있는 사람의 수로 생각하고
내구도가 0보다 떨어지는 디딤돌이 k개 보다 많은지 확인하고 많으면 max값을 줄여주고, 적으면 min값을 올려줘서 k값에 근접하도록 풀어준다.
[코드]
def solution(stones, k):
min_v = min(stones)
max_v = max(stones)
while min_v <= max_v:
mid_v = min_v + (max_v - min_v) // 2
count = 0
over = False
for i in range(len(stones)):
if stones[i] - mid_v <= 0:
count += 1
if count == k:
over = True
break
else:
count = 0
if over:
max_v = mid_v - 1
else:
min_v = mid_v + 1
return min_v
'ALGORITHM > Programmers' 카테고리의 다른 글
[프로그래머스] 순위 검색.py (0) | 2022.06.04 |
---|---|
[프로그래머스] 신고 결과 받기.py (0) | 2022.01.23 |
[프로그래머스] 정수 삼각형.py (0) | 2022.01.09 |
프로그래머스 큰 수 만들기.py (0) | 2021.12.05 |
[프로그래머스] 프렌즈4블록.py (0) | 2021.11.15 |
- Total
- Today
- Yesterday
- 파이썬
- 프로그래머스
- leetcode
- query
- 소프트웨어 장인
- for-else
- 의대 신경학 강의
- sql lite
- conTeXt
- 백준
- django
- go context
- Two Scoops of Django
- dfs
- go
- 독후감
- stdout
- Python
- 방금그곡
- gunicorn
- 문자열 뒤집기
- ManyToMany
- taggit
- 팰린드롬수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |