🔗 문제
https://www.acmicpc.net/problem/27111
📌 문제 요약
하루 동안의 출입 기록이 시간 순서대로 주어진다. 각 기록은 사람 번호 a_i와, 입장이면 1·퇴장이면 0인 b_i로 이루어진다.
하루가 시작할 때와 끝날 때 건물 안에는 아무도 없어야 하고, 같은 사람이 연속으로 두 번 입장하거나 두 번 퇴장할 수는 없다.
일부 기록이 누락되었을 때, 기록이 모순 없이 성립하려면 최소 몇 개의 기록이 빠진 것인지 구한다.입력: 첫 번째 줄에 출입 기록의 개수 N이 주어진다. (1 <= N <= 200,000)
두 번째 줄부터 N+1번째 줄까지, i번째 출입 기록을 나타내는 정수 a_i와 b_i가 공백으로 구분되어 주어진다
출력: 오늘 하루 동안 누락된 출입 기록의 최소 개수를 출력한다.
💡 접근 방법
map을 사용해 각 번호의 출입 기록을 기록한다.
이전 값과 입력된 값을 비교하는 조건을 넣어 카운팅하고,
모든 값이 입력된 후 들어온 기록만 있다면 카운팅을 더해준다.
⚠️ 처음에 했던 실수
💻 코드
#include <iostream>
#include <map>
using namespace std;
int N;
map<int, int> ent;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
int cnt = 0;
for (int i = 0; i < N; ++i) {
int num, write;
cin >> num >> write;
auto it = ent.find(num);
if (it == ent.end()) {
if (write == 0)
cnt++;
ent.insert({num, write});
} else {
if (it->second == 1 && write == 1)
cnt++;
if (it->second == 0 && write == 0)
cnt++;
it->second = write;
}
}
for (auto it = ent.begin(); it != ent.end(); ++it) {
if (it->second == 1)
cnt++;
it->second = 0;
}
cout << cnt;
return 0;
}