Home > Algorithm > BOJ > [BOJ] 27111번 출입 기록 / C++

[BOJ] 27111번 출입 기록 / C++
C++ 백준 BOJ 알고리즘 Algorithm

🔗 문제

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;
}