이번에는 백준 2979번 트럭 주차 문제를 풀어보았습니다.
이 문제는 세 대의 트럭이 각각 주차장에 머무른 시간이 주어졌을 때, 시간대별로 몇 대의 트럭이 주차되어 있는지를 계산해서 총 주차 요금을 구하는 문제입니다.
트럭이 한 대 주차되어 있을 때는 1분당 A원,
두 대가 주차되어 있을 때는 한 대당 B원,
세 대가 주차되어 있을 때는 한 대당 C원을 냅니다.
즉,
A2 * B3 * C를 해당 시간마다 더해주면 됩니다.
세 대의 트럭에 대해 도착 시간과 떠난 시간이 주어질 때, 전체 주차 요금을 구하는 것이 목표입니다.
이 문제는 각 시간마다 몇 대의 트럭이 주차되어 있는지만 알 수 있으면 풀 수 있습니다.
그래서 크기가 101인 배열을 하나 두고,
각 시간에 몇 대의 트럭이 머물렀는지를 기록하는 방식으로 접근했습니다.
예를 들어 어떤 트럭이 1부터 5까지 주차했다면,
해당 시간 구간에 대해 배열 값을 1씩 증가시키는 식입니다.
그 뒤 배열을 순회하면서
A2 * B3 * 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;
}
A, B, C 요금을 입력받는다.cnt 배열 값을 증가시킨다.이 문제에서 중요한 부분은 시간 구간을 어떻게 잡느냐였습니다.
노션에도 적어두었듯이,
이런 문제는 보통 시작은 이상, 끝은 미만으로 잡는 것이 더 자연스럽습니다.
즉, 어떤 트럭이 st에 도착해서 end에 떠난다면,
실제로 주차되어 있는 시간은 st <= t < end 형태로 보는 것이 일반적입니다.
시간 구간을 어떻게 포함시킬지를 정확히 잡아야
배열 카운팅에서도 헷갈리지 않습니다.