개인사
[G3] 백준 20440번 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1 C++ 정렬, 값/좌표 압축, 누적합, 차분 배열 트릭 본문
알고리즘 공부/C++
[G3] 백준 20440번 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1 C++ 정렬, 값/좌표 압축, 누적합, 차분 배열 트릭
마달랭 2025. 11. 22. 08:57728x90

리뷰

https://www.acmicpc.net/problem/20440
문제 제목이 왜이렇게 긴걸까
전역 변수
- N : 배열의 최대 길이를 정의할 상수 변수
- mos : 모기의 등장 시간을 저장할 배열
- n : 모기의 개수를 저장할 변수
함수
없음
문제풀이
- n값을 입력 받고, 정수형 변수 times를 초기화한다.
- n마리의 모기의 진행 시간을 입력 받아 mos, times를 초기화 해준다.
- sort함수를 통해 times를 오름차순으로 정렬하고, erase, unique함수를 통해 중복을 제거해준다.
- 변수 m에 times의 크기를 저장하고, 정수형 벡터 diff를 m+1크기로, 초기값은 0으로 초기화한다.
- n마리의 모기 정보를 순회하며 변수 si, ei에 모기의 입장 시간과 퇴장 시간의 인덱스를 times로부터 구해준다.
- diff[si]를 증가시키고, diff[ei]를 감소시켜 차분 배열을 초기화한다.
- 변수 mx, cur을 0으로 초기화 하고, diff를 기반으로 모기가 가장 많을 때의 마릿수를 mx에 저장한다.
- 변수 si, ei, cur을 0으로 초기화, flag를 false로 초기화하고, 다시 cur에 차분값을 더한다.
- cur이 mx에 도달했을때부터 구간을 측정하여 cur이 mx가 아니게 되었을때 종료한다.
- mx를 출력하고 개행문자를 삽입해 줄바꿈을 수행하고, si, ei를 공백을 기준으로 출력한다.
트러블 슈팅
없음
참고 사항
- (0 ≤ TE < TX ≤ 2,100,000,000)이므로 값/좌표 압축을 통해 인덱싱이 필요하다.
- 해당 인덱스를 기준으로 누적합을 수행한다.
정답 코드
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using pii = pair<int, int>;
const int N = 1e6;
pii mos[N];
int n;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
vector<int> times;
for (int i = 0; i < n; ++i) {
int st, et; cin >> st >> et;
mos[i] = { st, et };
times.push_back(st);
times.push_back(et);
}
sort(times.begin(), times.end());
times.erase(unique(times.begin(), times.end()), times.end());
int m = times.size();
vector<int> diff(m + 1, 0);
for (int i = 0; i < n; ++i) {
int st = mos[i].first;
int et = mos[i].second;
int si = lower_bound(times.begin(), times.end(), st) - times.begin();
int ei = lower_bound(times.begin(), times.end(), et) - times.begin();
++diff[si];
--diff[ei];
}
int mx = 0;
int cur = 0;
for (int i = 0; i < m; ++i) {
cur += diff[i];
if (cur > mx) mx = cur;
}
long long si = 0, ei = 0;
cur = 0;
bool flag = false;
for (int i = 0; i < m; ++i) {
cur += diff[i];
if (cur == mx) {
if (!flag) {
flag = true;
si = times[i];
}
ei = times[i + 1];
}
else if (flag) break;
}
cout << mx << "\n" << si << " " << ei;
}728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
| [G4] 백준 10159번 저울 C++ 플로이드 와샬 (0) | 2025.11.26 |
|---|---|
| [G5] 백준 5588번 별자리 찾기 C++ 브루트포스 알고리즘, 해시 집합, unordered_set (0) | 2025.11.25 |
| [G1] 백준 16638번 괄호 추가하기 2 C++ 구현, 백트래킹 (0) | 2025.11.21 |
| [G4] 백준 22945번 팀 빌딩 C++ 투 포인터 (0) | 2025.11.21 |
| [G5] 백준 9024번 두 수의 합 C++ 투 포인터, 정렬 (0) | 2025.11.21 |
