[백준 BOJ] 14402번 야근 (C++/cpp)

2026. 1. 12. 17:24PS (Program Solving)/BOJ (백준)

문제 설명

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

 

백준 BOJ 14402번 야근 문제 사진

 

접근 방법 - 맵을 활용한 연산 응용문제

백준의 14402번 문제는 맵 자료구조를 활용하여 연산을 진행하면서 정답을 구해야 하는 문제이다.

해당 문제는, 입력으로 직원들의 출퇴근 기록들이 주어질 때 직원들이 야근한 총횟수를 구하여 정답으로 출력해야 하는 문제이다.

이때, 야근으로 간주하는 조건은 아래와 같으니 함께 참고하길 바란다.

  • 직전에 출근한 기록(+)이 없는데 퇴근한 기록(-)이 있다면 야근한 것으로 간주한다.
  • 직전에 출근한 기록(+)이 있는데 퇴근한 기록(-)이 없다면 야근한 것으로 간주한다.
  • 이때, 동명이인을 구별하지 못한다는 전제가 있다.

 

여러 명의 직원 출퇴근 기록이 입력으로 주어진다는 점을 감안하여, 필자는 맵 자료구조를 활용하였다.

이때 숫자 인덱스를 기본으로 사용하는 배열과 달리, 맵은 key와 value를 다양한 자료형으로 설정하여 활용할 수 있는 자료구조라 볼 수 있다.

필자는 이러한 맵을 <직원 이름, 출퇴근 값>의 형태로 설정하여 활용할 예정이다.

보다 자세한 설명은 아래에 기재해 놓으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 출퇴근 기록의 개수(n)를 입력받는다.

이때, 다음 입력으로 주어질 문자열 값과 충돌이 일어나지 않게끔, 필자는 cin.ignore()로 미리 버퍼를 비워주도록 하였다.

 

2) 직원들이 야근한 총횟수를 저장할 변수 count를 0으로 초기화하여 미리 선언해 둔다.

그리고 각 직원들의 출퇴근 값을 저장하기 위한 맵 io를 <string, int> 형태로 선언해 둔다.

(특정 직원이 출근하였다면 +1 연산을, 퇴근하였다면 -1 연산을 진행할 예정이다.)

 

3) n의 크기만큼, 반복문을 수행하여 아래의 연산을 취한다.

- 출퇴근 기록에 있는 직원의 이름(name)과 출퇴근 여부(c)를 순차적으로 입력받는다.

- 직전에 입력으로 받은 값과 io에 저장된 값을 기반으로, 아래 절차를 따라 야근 여부를 확인하도록 한다.

* 직전에 입력받은 값이 '+'라면, 해당 직원이 방금 출근했음을 의미한다.
따라서 이 경우에는, 현재 name값을 key로 갖는 io 값에 1을 추가해 주도록 한다.
* 직전에 입력받은 값이 '-'라면, 해당 직원이 방금 퇴근했음을 의미한다.
이때 현재 name값을 key로 갖는 io 값이 0이라면, 이는 직전에 출근한 기록이 없음을 뜻하기 때문에 야근한 기록으로 볼 수 있다. 따라서 이 경우에는, 그 즉시 count에 1을 추가하도록 한다.
다만 해당 io 값이 0이 아닌 자연수 값을 가진다면, 직전에 출근한 기록이 있음을 뜻하기 때문에 해당 io 값에 1을 빼주도록 한다.

 

4) 3)의 연산이 끝났다면, 야근 여부에 대한 마무리 연산을 위해 반복문을 활용하여 io의 요소값들을 살피도록 한다.

만약 특정 직원의 value값이 0이 아닌 양수값을 가진다면, 이는 직원들의 야근 횟수에 포함시켜야 하기 때문에 이 value값을 count에 추가해 주도록 한다.

 

5) 최종적으로 저장된 count의 값을 정답으로 출력한 뒤, 실행을 종료한다. 

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <map>
#define endl '\n'
using namespace std;

//백준 14402번 코드
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);   cout.tie(NULL);

    int n;
    cin >> n;
    cin.ignore();
    
    int count = 0;
    map<string, int> io;
    for (int i = 0; i < n; i++) {
        string name;
        char c;
        cin >> name >> c;
        
        if (c == '+') {
            io[name]++;
        }
        else {
            if (io[name] == 0) { count++; }
            else { io[name]--; }
        }
    }
    for (auto el : io) {
        count += el.second;
    }

    cout << count << endl;
}

 

제출 결과

백준 BOJ 14402번 야근 문제 C++ 제출 결과

(2024.12.01 백준 14402번 문제 제출 결과)