본문 바로가기

프로그래밍지식/알고리즘

백준 트럭주차요금 문제 2979 C++

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

 

2979번: 트럭 주차

첫째 줄에 문제에서 설명한 주차 요금 A, B, C가 주어진다. (1 ≤ C ≤ B ≤ A ≤ 100) 다음 세 개 줄에는 두 정수가 주어진다. 이 정수는 상근이가 가지고 있는 트럭이 주차장에 도착한 시간과 주차장

www.acmicpc.net

 

 

 

간단한설명

 

상근이는 트럭 3대가 있고 주차장에 각기 다른시간에 차를주차하고 나간다. 주차장은 주차된 차량의 수에 따라 각기 다른 요금을 받고있다.

예를들어 1시부터 3시사이에 차량을 2대 주차했으면 B만큼 3대 주차했으면 C만큼의 요금제로 계산된다. 상근이는 각기 다른시간에 차를 주차하고 나가니 겹치는시간을 카운팅해서 차량수에 맞는 주차비를 지불하면된다.

 

여담으로 나는 문제를 이해하는것도 정말힘들었다. 지금이렇게 이해하게된것도 참 감개무량하다 ㅠㅠ. 하루종일 고민해서 푼코드다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<bits/stdc++.h>
using namespace std;
 
int arr[100],cnt[100];
int A,B,C;
int a,b;
int sum =0;
 
int main() {
    cin >> A >> B >> C;
 
    for(int i=0; i<3; i++)
     {
        cin >> a >> b;
 
        for(int i =a; i<b; i++)
        {
            arr[i] = i;
            if(arr[i]) cnt[i] ++;
        }
    }
    
    for(int i=0; i<100; i++){
        
        if(cnt[i] == 1){
            sum += (1 * A);
        }
        else if(cnt[i] == 2){
            sum += (2 * B);
        }
        else if(cnt[i] ==3) {
            sum += (3 * C);
        } 
    }
     cout << sum << "\n";
return 0;
}
cs

 

 

그리고 큰돌님이 푸신 정답지이다. 차이라고하면 나는 배열을 2개나 만들어서 하나에 값을 넣고 있으면 카운팅하는 로직이었다.

그런데 굳이 그럴필요없이 차량의 출발시간과 도착시간전까지를 카운팅 배열 주소에 카운트를 하면된다.

그이후에는 배열을 반복하면서 차량대수만큼 요금제를 받고 sum 변수에 값을 넣어두면 된다

 

 

큰돌님 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<bits/stdc++.h>
using namespace std;
int A,B,C,cnt[104],ret,a,b;
 
 
int main() {
 
cin >> A >> B >> C;
for(int i=0; i<3; i++)
{
    cin >> a >> b;
 
    for(int j =a; j<b; j++) cnt[j]++;
}
 
for(int i=0; i<100; i++)
{
    if(cnt[i] == 1) ret += A * 1;
    else if(cnt[i] == 2) ret += B*2;
    else if(cnt[i] == 3) ret += C*3;
}
 
cout << ret << "\n";
 
}
cs

 

 

Tip.아 추가적으로 배열의 크기는 딱맞게 보다는 조금 사이즈를 늘려주는게 좋다고 하셨다. 만약 100만큼의 공간이 필요하다고 문제에서 나왔으면 4정도더늘려주는게 좋다

 

 

 

오늘 하루도 내게 행운이 깃들길