728x90
트럭 주차
다국어
시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 | 128 MB | 5426 | 3747 | 3220 | 69.322% |
문제
상근이는 트럭을 총 세 대 가지고 있다. 오늘은 트럭을 주차하는데 비용이 얼마나 필요한지 알아보려고 한다.
상근이가 이용하는 주차장은 주차하는 트럭의 수에 따라서 주차 요금을 할인해 준다.
트럭을 한 대 주차할 때는 1분에 한 대당 A원을 내야 한다. 두 대를 주차할 때는 1분에 한 대당 B원, 세 대를 주차할 때는 1분에 한 대당 C원을 내야 한다.
A, B, C가 주어지고, 상근이의 트럭이 주차장에 주차된 시간이 주어졌을 때, 주차 요금으로 얼마를 내야 하는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 문제에서 설명한 주차 요금 A, B, C가 주어진다. (1 ≤ C ≤ B ≤ A ≤ 100)
다음 세 개 줄에는 두 정수가 주어진다. 이 정수는 상근이가 가지고 있는 트럭이 주차장에 도착한 시간과 주차장에서 떠난 시간이다. 도착한 시간은 항상 떠난 시간보다 앞선다. 입력으로 주어지는 시간은 1과 100사이 이다.
출력
첫째 줄에 상근이가 내야하는 주차 요금을 출력한다.
예제 입력 1 복사
5 3 1
1 6
3 5
2 8
예제 출력 1 복사
33
예제 입력 2 복사
10 8 6
15 30
25 50
70 80
예제 출력 2 복사
480
정리
작성한 코드
#include <bits/stdc++.h>
using namespace std;
int a,b,c;
pair<int,int> t[3];
int e[104]; //구간 1~100
int cost;
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
//1. 입력받기
cin >> a >> b >> c;
for(int i=0;i<3;i++) cin >> t[i].first >> t[i].second;
//2. 겹치는 범위 계산하기
for(int i=0;i<3;i++){
for(int j=t[i].first;j<t[i].second;j++){
e[j]++;
}
}
//3. 비용계산하기
for(int ee:e){
if(ee==1) cost+=a*1;
else if(ee==2) cost+=b*2;
else if(ee==3) cost += c*3;
else;
}
//4. 비용 출력하기
cout << cost;
return 0;
}
범위라서 누적합이 떠오르는데 누적합을 사용하기 적합하지 않다고 생각했다.
값이 누적되는 것이 아니고, 단지 구간만 구하기 때문이다.
유의점
- 변수명으로 time 사용이 불가능하다. (변수명은 짧게 압축해서 써야될것같다.)
- cin <<, cout은 >> 헷갈리지 말자
- for(int ee:e)에서 원소가 앞이고, 배열은 뒤, 헷갈리지말자
- 배열에서 시간구간이 a부터 b이면, a부터 b-1까지 사용된다.
맞았다..시간초과 뜰 줄 알았는데..
선생님 코드
#include <bits/stdc++.h>
using namespace std;
int A,B,C,a,b,cnt[104], ret;
int main(){
//1. 입력받기
cin >> A >> B >> C;
// 입력받으면서 카운팅 배열 채우기
for(int i=0;i<3;i++){
cin >> a >> b;
for(int j=a;j<b;j++) cnt[j]++; //구간은 이상, 미만
}
//2. 비용 계산하기
for(int j=1;j<100;j++){ //구간은 이상 미만이므로 100 포함 X
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;
}
}
//3. 출력
cout << ret << "\n";
return 0;
}
포인트
- 시작시간, 도착시간같은 시작과 끝 지점이 있는 구간은 카운팅 배열이 생각나야한다 (구간 지나갈때마다 +1)
- 시각은 이상, 미만이다. (for 반복문에서 시작시간은 포함, 떠난시간은 포함X)
- 반복문을 반복하는 것을 막기 위해 같은 반복문에서 처리할 수 있도록 하자.
- 구간이 1~100 사이일때 배열의 범위를 넉넉하게 104로 만들었는데, 출력시에는
for 범위 반복문을 사용하면 cnt[100], cnt[101]..도 출력이 되므로 반복 횟수를 명시하여 cnt[99]까지만 출력되도록 하자. - 카운팅 배열을 사용할때에는 먼저 값의 존재 여부를 if문으로 파악한다.
- 대문자, 소문자로 변수를 구분할 수 있다.
피드백 후 나의 코드
#include <bits/stdc++.h>
using namespace std;
int A,B,C, a,b, cnt[104], ret;
int main(){
//1. 입력받기
cin >> A >> B >> C;
for(int i=0;i<3;i++){
cin >> a >> b;
for(int j=a;j<b;j++) cnt[j]++; //카운팅 배열 채우기, 구간은 이상,미만
}
//2. 비용 계산하기
for(int i=1;i<100;i++){ //구간 1~100은 1 포함, 100 포함X
if(cnt[i]){ //값 존재여부 파악
if(cnt[i]==1) ret += A;
else if (cnt[i]==2) ret += B*2;
else if (cnt[i]==3) ret += C*3;
}
}
//3. 출력
cout << ret << "\n";
return 0;
}
728x90
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
11655번: ROT13 (0) | 2022.12.31 |
---|---|
1159번: 농구 경기 (2) | 2022.12.31 |
10998번 : 팰린드롬인지 확인하기 (0) | 2022.12.31 |
10808: 알파벳 개수 (0) | 2022.12.30 |
2309: 일곱 난쟁이 (0) | 2022.12.29 |