
리뷰

https://www.acmicpc.net/problem/13397
파라매트릭 서치의 기본이 되는 문제
전역 변수
- n : 배열의 크기를 저장할 변수
- m : 구간의 개수를 저장할 변수
- ans : 정답을 저장할 변수
- lst : 배열 정보를 저장할 정수형 배열
함수
없음
문제풀이
- n, m값을 입력 받고, lst배열에 n개의 배열 요소를 입력받아 준다.
- l을 0, r을 10000으로 초기화 해주고 l이 r보다 이하일 경우 while루프를 반복해 준다.
- 정수형 변수 mid를 l + r을 2로 나눈 값으로 저장해 준다.
- 구간의 개수 cnt를 1로, 최대 및 최소값 MAX, MIN을 lst배열의 첫 인자로, diff를 MAX-MIN값으로 초기화 한다.
- 배열의 두번째 요소부터 마지막 요소까지 for문을 통해 순회해 준다.
- 현재 요소가 MAX보다 크면 MAX를 현재 요소로, MIN보다 작으면 MIN을 현재 요소로 변경해 준다.
- diff값을 MAX-MIN으로 다시 저장해 준다.
- 만약 diff가 mid보다 크다면 cnt를 증가시키고, MAX, MIN을 현재 요소로, diff를 0으로 초기화 한다.
- 탐색을 마친 후 cnt가 m보다 크다면 l을 mid + 1로 변경해 준다.
- cnt가 m보다 작거나 같다면 ans를 mid와 비교하여 더 작은 값으로 갱신하고 r을 mid - 1로 변경해 준다.
- 모든 탐색을 마친 후 ans에 저장된 값을 출력해 준다.
트러블 슈팅
없음
참고 사항
- 초기 및 cnt증가 시 diff를 0으로 초기화 해도 된다. 가독성을 위해 MAX-MIN으로 명시해 주었다.
정답 코드
#include<iostream>
using namespace std;
int n, m, ans = 10000;
int lst[10000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for (int i = 0; i < n; ++i) cin >> lst[i];
int l = 0, r = 10000;
while (l <= r) {
int mid = (l + r) / 2;
int cnt = 1;
int MAX = lst[0];
int MIN = lst[0];
int diff = MAX - MIN;
for (int i = 1; i < n; ++i) {
if (MAX < lst[i]) MAX = lst[i];
else if (MIN > lst[i]) MIN = lst[i];
diff = MAX - MIN;
if (diff > mid) {
cnt++;
MAX = lst[i];
MIN = lst[i];
diff = MAX - MIN;
}
}
if (cnt > m) l = mid + 1;
else {
ans = min(ans, mid);
r = mid - 1;
}
}
cout << ans;
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[S1] 백준 2468번 안전 영역 C++ 너비 우선 탐색, 플러드 필 (0) | 2025.01.20 |
---|---|
[P5] 백준 15678번 연세워터파크 C++ 덱, 덱을 이용한 다이나믹 프로그래밍 (0) | 2025.01.19 |
[G3] 백준 10423번 전기가 부족해 C++ 최소 신장 트리, 유니온-파인드, 정렬 (0) | 2025.01.18 |
[G1] 백준 16933번 벽 부수고 이동하기 3 C++ 너비 우선 탐색 (0) | 2025.01.17 |
[G4] 백준 22856번 트리 순회 C++ 깊이 우선 탐색, 트리 (0) | 2025.01.16 |