티스토리 뷰
< 해설 >
어제에 이어 오늘도 이분탐색 문제다!
일단 문제를 보고 for문으로 한명씩 보내면서 탐색하는 방법을 사용해봤다. for문으로 풀면서 뭐야 레벨3 이렇게 쉬워도 돼? 라고 생각했는데 역시나 for문으로는 풀리지 않는 문제이다. 배열의 크기가 200,000 일수도 있기때문.
어제까진 이분탐색을 언제 사용해야하는지 감이 좀 잡히지 않았는데 오늘 문제를 풀고나니 좀 감이 잡힌다.
풀이 방법은 mid 값을 정해준 뒤 mid 값의 니니즈 친구들을 전부 보내보는 방법이다. 그러다 건널 수 없게되면 mid 값을 하나 낮춰서 진행하면 된다. 그러면 mid 값은 어떻게 구하는지 궁금할 수 있게된다. 일단 left는 무조건 1로 둔다. 그리고 right 값은 징검다리 돌중에 가장 큰 원소값을 가져온다. 징검다리 원소수보다 많은 니니즈 친구들은 건널 수 없기 때문임.
그리고 이분탐색 돌리면된다.
문제 감이 안와서 다른 사람들의 풀이를 봤는데 바로 이해가서.. 좀 슬펐던 문제 ^_T
< 문제 >
카카오 초등학교의 "니니즈 친구들"이 "라이언" 선생님과 함께 가을 소풍을 가는 중에 징검다리가 있는 개울을 만나서 건너편으로 건너려고 합니다. "라이언" 선생님은 "니니즈 친구들"이 무사히 징검다리를 건널 수 있도록 다음과 같이 규칙을 만들었습니다.
- 징검다리는 일렬로 놓여 있고 각 징검다리의 디딤돌에는 모두 숫자가 적혀 있으며 디딤돌의 숫자는 한 번 밟을 때마다 1씩 줄어듭니다.
- 디딤돌의 숫자가 0이 되면 더 이상 밟을 수 없으며 이때는 그 다음 디딤돌로 한번에 여러 칸을 건너 뛸 수 있습니다.
- 단, 다음으로 밟을 수 있는 디딤돌이 여러 개인 경우 무조건 가장 가까운 디딤돌로만 건너뛸 수 있습니다.
"니니즈 친구들"은 개울의 왼쪽에 있으며, 개울의 오른쪽 건너편에 도착해야 징검다리를 건넌 것으로 인정합니다.
"니니즈 친구들"은 한 번에 한 명씩 징검다리를 건너야 하며, 한 친구가 징검다리를 모두 건넌 후에 그 다음 친구가 건너기 시작합니다.
디딤돌에 적힌 숫자가 순서대로 담긴 배열 stones와 한 번에 건너뛸 수 있는 디딤돌의 최대 칸수 k가 매개변수로 주어질 때, 최대 몇 명까지 징검다리를 건널 수 있는지 return 하도록 solution 함수를 완성해주세요.
입출력 예 #1
첫 번째 친구는 다음과 같이 징검다리를 건널 수 있습니다.
첫 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다.
두 번째 친구도 아래 그림과 같이 징검다리를 건널 수 있습니다.
두 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다.
세 번째 친구도 아래 그림과 같이 징검다리를 건널 수 있습니다.
세 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다.
네 번째 친구가 징검다리를 건너려면, 세 번째 디딤돌에서 일곱 번째 디딤돌로 네 칸을 건너뛰어야 합니다. 하지만 k = 3 이므로 건너뛸 수 없습니다.
따라서 최대 3명이 디딤돌을 모두 건널 수 있습니다.
< 풀이 >
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool BS(const vector<int>& _stones, int _mid, int _k)
{
int count =0;
for(auto s : _stones)
{
if(s < _mid)
count++;
else
count =0;
if(_k <= count)
return false;
}
return true;
}
int solution(vector<int> stones, int k) {
int answer = 0;
int left = 0;
int right = *max_element(stones.begin(), stones.end());
while(left <= right)
{
int mid = (left + right) / 2;
if(BS(stones, mid, k))
{
left = mid + 1;
if(answer < mid)
answer = mid;
}
else
{
right = mid - 1;
}
}
return answer;
}
'공부 > 코딩테스트' 카테고리의 다른 글
[ 프로그래머스 C++ ] 파괴되지 않은 건물 lv3 (1) | 2023.05.16 |
---|---|
[ 프로그래머스 C++ ] 가장 먼 노드 lv3 (0) | 2023.05.15 |
[ 프로그래머스 C++ ] 입국심사 lv3 (0) | 2023.05.11 |
[ 프로그래머스 C++ ] 등굣길 (0) | 2023.05.09 |
[백준 C++] 2775번 부녀회장이 될테야 (0) | 2023.05.08 |
- Total
- Today
- Yesterday
- 개인공부
- Unreal 5.1
- Heap
- BFS
- 힙
- LV3
- level3
- LV2
- C++
- 디자인 패턴
- 누적합
- 고득점 Kit
- IMGUI
- 해시
- FPS
- DFS
- 프로그래머스
- 정렬
- greedy
- Ue
- UE5
- 너비우선탐색
- 고득점kit
- sort
- 데디케이티드
- 채팅서버
- 재귀
- 탐욕법
- 스택/큐
- 완전탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |