[PS] 백준 2979 트럭 주차

박상혁·2026년 5월 20일

PS

목록 보기
3/95

이번에는 백준 2979번 트럭 주차 문제를 풀어보았습니다.

이 문제는 세 대의 트럭이 각각 주차장에 머무른 시간이 주어졌을 때, 시간대별로 몇 대의 트럭이 주차되어 있는지를 계산해서 총 주차 요금을 구하는 문제입니다.

문제 설명

트럭이 한 대 주차되어 있을 때는 1분당 A원,

두 대가 주차되어 있을 때는 한 대당 B원,

세 대가 주차되어 있을 때는 한 대당 C원을 냅니다.

즉,

  • 1대 주차 중이면 A
  • 2대 주차 중이면 2 * B
  • 3대 주차 중이면 3 * C

를 해당 시간마다 더해주면 됩니다.

세 대의 트럭에 대해 도착 시간과 떠난 시간이 주어질 때, 전체 주차 요금을 구하는 것이 목표입니다.

풀이 아이디어

이 문제는 각 시간마다 몇 대의 트럭이 주차되어 있는지만 알 수 있으면 풀 수 있습니다.

그래서 크기가 101인 배열을 하나 두고,

각 시간에 몇 대의 트럭이 머물렀는지를 기록하는 방식으로 접근했습니다.

예를 들어 어떤 트럭이 1부터 5까지 주차했다면,

해당 시간 구간에 대해 배열 값을 1씩 증가시키는 식입니다.

그 뒤 배열을 순회하면서

  • 값이 1이면 A
  • 값이 2이면 2 * B
  • 값이 3이면 3 * C

를 더해 총합을 구하면 됩니다.

코드

#include <bits/stdc++.h>
using namespace std;

int A, B, C;
int cnt[101];
int truck[3][2];

int calculate() {
    int sum = 0;
    for (int i = 0; i < 101; i++) {
        if (cnt[i] == 1) {
            sum += A;
        } else if (cnt[i] == 2) {
            sum += (2 * B);
        } else if (cnt[i] == 3) {
            sum += (3 * C);
        }
    }
    return sum;
}

int solve() {
    for (int i = 0; i < 3; i++) {
        int st = truck[i][0];
        int end = truck[i][1];

        for (int i = st + 1; i <= end; i++) {
            cnt[i]++;
        }
    }
    return calculate();
}

int main() {
    cin >> A >> B >> C;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            cin >> truck[i][j];
        }
    }

    int result = solve();
    cout << result << endl;

    return 0;
}

풀이 흐름

  1. A, B, C 요금을 입력받는다.
  2. 세 대의 트럭에 대해 도착 시간과 떠난 시간을 입력받는다.
  3. 각 트럭이 머문 시간 구간 동안 cnt 배열 값을 증가시킨다.
  4. 모든 시간대를 확인하면서, 해당 시간에 주차된 트럭 수에 맞는 요금을 더한다.
  5. 최종 합계를 출력한다.

구현 포인트

이 문제에서 중요한 부분은 시간 구간을 어떻게 잡느냐였습니다.

노션에도 적어두었듯이,

이런 문제는 보통 시작은 이상, 끝은 미만으로 잡는 것이 더 자연스럽습니다.

즉, 어떤 트럭이 st에 도착해서 end에 떠난다면,
실제로 주차되어 있는 시간은 st <= t < end 형태로 보는 것이 일반적입니다.

시간 구간을 어떻게 포함시킬지를 정확히 잡아야

배열 카운팅에서도 헷갈리지 않습니다.

profile
엉덩이로 성장하는 개발자

0개의 댓글