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

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

🔗 문제

https://www.acmicpc.net/problem/27111


📌 문제 요약

상근이는 카약 대회를 개최했다. 대회는 전세계에 생중계되고, 위성이 경기장 전체를 촬영하고 있다. 상근이는 위성 사진을 바탕으로 실시간 순위를 계산하는 프로그램을 만들려고 한다.
위성 사진은 R행 C열이다. 모든 줄의 첫 번째 글자는 ‘S’이고 출발선을 의미한다. 또, 마지막 글자는 ‘F’이고 이것은 결승선을 의미한다. 대회에 참가한 팀은 총 9팀이고, 각 팀은 1부터 9까지 번호가 매겨져 있다. 카약은 항상 열에 대해 연속하는 세 칸을 차지하며, 카약 번호로 표시한다. 마지막으로 물은 ‘.’로 나타나 있다.
팀의 순위는 결승선으로부터 떨어진 거리로 측정한다. 가까울수록 순위가 높다. 만약, 두 팀이 결승선과 떨어진 거리가 같다면, 같은 등수이다.

입력: 첫 번째 줄에 출입 기록의 개수 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;
}