* 해당 문제 풀이는 '큰돌'님의 문제풀이에서 제가 이해한 부분을 재작성한것입니다
백준 2979번 트럭주차 입니다
문제 해석
이 문제는 해석하는데 조금 어려웠습니다
우선 상근이는 트럭을 총 세대는 가지고 있고, 상근이가 이용하는 주차장은 주차하는 트럭의 수에 따라서 주차 요금을 할인 해줍니다
즉 1대 주차할때 한대당 A원, 2대 주차할때 한대당 B원, 3대 주차 할때 한대당 C원이 요금을 내야됩니다
예제를 보게되면
우선 각 A,B,C원에 대한 정수값이 입력이 되고, 그다음주에 상근이가 트럭을 주차하고 도착한 시간과 주차장에서 떠난 시간이 입력 이 되는것입니다
여기서 중요한 것은 시간입니다
우선 처음 시간이 1~6이 입력이 됩니다 즉 1분 에서 5분까지 트럭이 한대가 있었고, 그다음은 3분 에서 4분까지 또 트럭이 한대, 2분에서 7분까지 트럭이 한대가 있었다는 예제입니다
여기서 중요한 개념은 시각(시간) 이라는 개념은 이상-미만 즉 a는 포함이되지만 b는 포함되지 않는 범위로 생각을 해주어야 합니다
이를 토대로 각 시간별로 주차되어있는 트럭 갯수와 갯수에 따른 비용을 계산 하면 아래와 같이 나오고 총합은 33이 나오게됩니다
1분 : 1대 -> 총5원
2분 : 2대 -> 총6원
3분 : 3대 -> 총3원
4분 : 3대 -> 총3원
5분 : 2대 -> 총6원
6분 : 1대 -> 총5원
7분 : 1대 -> 총5원
8분 : 0대 -> 총0원
문제 풀이 순서
1. 요금인 A,B,C변수, 시간 범위 변수인 a,b, 트럭갯수를 세는 배열(카운팅배열), 그리고 최종 결과 변수를 선업합니다
2. 우선 A,B,C변수에 요금을 입력받습니다
3. 이후 반복문을 3번을 돌려 각 반복문 마다 시간 범위를 입력받습니다
4. 이때 입력받은 시간범위를 이상-미만 개념으로 해서 다시 중첩 반복문을돌려 트럭갯수를 세는 배열(카운팅배열)에 해당하는 인덱스를 +1를 해줍니다
5. 3번의 반복문이 모두 끝나면, 카운팅 배열을 순회합니다
6. 카운팅 배열을 순회하면서 트럭 갯수가 있는지 체크하고, 각 트럭 갯수에 따른 한대당 요금을 최종 결과 변수에 더해줍니다
작성 코드
#include <bits/stdc++.h>
using namespace std;
//카운팅배열, 분당 몇대의 트럭이 와있는지
int A,B,C,a,b,cnt[104],ret;
int main(){
cin >> A >> B >> C;
for(int i = 0; i < 3; i++){
cin >> a >> b;
//a는 포함되어있고 b는 포함되어있지않은 (이상-미만)
for(int j = a; j < b; j++)cnt[j]++;
}
for(int j = 1; j < 100; j++){
if(cnt[j]){
//트럭 한대당 비용 계산
if(cnt[j] == 1) ret += A;
else if(cnt[j] == 2) ret += B * 2;
else if(cnt[j] == 3) ret += C * 3;
}
}
cout << ret << "\n";
return 0;
}
'코딩테스트' 카테고리의 다른 글
백준 9375 패션왕 신해빈(C++) (1) | 2022.11.20 |
---|---|
백준 1620 나는야 포멧몬 마스터 이다솜(C++) (1) | 2022.11.19 |
백준 2559 수열(C++) (0) | 2022.11.17 |
백준 1159 농구 경기(C++) (0) | 2022.11.14 |
백준 2309 일곱난쟁이 (C++) (0) | 2022.11.12 |