문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/64062
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이분 탐색을 이용하는 문제였습니다.
알고리즘은 아래와 같습니다.
1. stones 배열의 각 원소의 값이 최소 1이므로 left를 1, right를 stones 배열 내 최고 원소로 선언합니다.
2. 1번에서 구한 left와 right를 기준으로 이분 탐색을 진행하여 mid를 기준으로 조건을 성립하는지 확인합니다.
2.1 조건을 성립하면 answer를 업데이트하고 mid를 높여야하므로 left를 mid + 1로 저장합니다.
2.2 조건을 성립하지 않으면 mid를 줄여야하므로 right를 mid - 1로 저장합니다.
3. 2번에서 구한 answer를 반환합니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string> | |
#include <vector> | |
#include <algorithm> | |
#include <queue> | |
#include <iostream> | |
using namespace std; | |
bool canCross(int mid, vector<int> stones, int k) | |
{ | |
queue<int> q; | |
for (int i = 0; i < stones.size(); i++) | |
{ | |
stones[i] = max(stones[i] - mid + 1, 0); | |
if (stones[i]) | |
{ | |
q.push(i + 1); | |
} | |
} | |
int prevIdx = 0; | |
int maxDistance = 0; | |
while (!q.empty()) | |
{ | |
int curIdx = q.front(); | |
q.pop(); | |
maxDistance = max(maxDistance, curIdx - prevIdx); | |
prevIdx = curIdx; | |
} | |
int stonesSize = stones.size(); | |
maxDistance = max(maxDistance, stonesSize - prevIdx + 1); | |
return maxDistance <= k; | |
} | |
int solution(vector<int> stones, int k) { | |
int maxStone = 0; | |
for (int stone : stones) | |
{ | |
maxStone = max(maxStone, stone); | |
} | |
int left = 1, right = maxStone; | |
int answer = 0; | |
while (left <= right) | |
{ | |
int mid = (left + right) / 2; | |
if (canCross(mid, stones, k)) | |
{ | |
answer = max(answer, mid); | |
left = mid + 1; | |
} | |
else | |
{ | |
right = mid - 1; | |
} | |
} | |
return answer; | |
} |

개발환경: Programmers IDE
지적, 조언, 질문 환영합니다! 질문 남겨주세요~
반응형
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers] 캠핑 (0) | 2022.08.02 |
---|---|
[Programmers] 호텔 방 배정 (0) | 2022.07.29 |
[Programmers] 길 찾기 게임 (0) | 2022.07.26 |
[Programmers] 기둥과 보 설치 (0) | 2022.07.21 |
[Programmers] 광고 삽입 (0) | 2022.07.21 |