문제 설명의 양이 상당하지만 로직은 복잡하지 않았던 문제였습니다.
음식 A와 B는 이름(string)과 가격(long long)을 저장하기 위해서 map으로 선언했고
디저트 C는 이름(string)만 존재하기 때문에 set으로 선언했습니다.
문제에서 주어지는 대로 A, B, C의 입력을 처리한 다음에 고객의 주문표가 입력되는데 이 주문표가 문제에서 제시된
음식 주문법에 부합하는지를 판별하는 코드를 작성해야 합니다.
- 특별메뉴는 일반메뉴에서 총 20,000원 이상을 주문해야 주문할 수 있다.
- 서비스메뉴는 일반메뉴와 특별메뉴에서 총 50,000원 이상을 주문해야 주문할 수 있다.
- 서비스메뉴는 단 하나만 주문할 수 있다.
위의 주문법을 만족하는지 판별하기 위해서는 총 4가지의 정보가 필요합니다.
1. 주문표 속 음식 A의 총 가격 ( sum_a )
2. 주문표 속 음식 B의 총 가격 ( sum_b )
3. 주문표 속 음식 B의 개수 ( cnt_b )
4. 주문표 속 음식 C의 개수 ( cnt_c )
판별하는 부분을 코드로 다음과 같이 구현했습니다.
// A 가격과 B 가격을 더하기 위한 total 변수 선언
long long total;
string result = "Okay";
// 20000원 이상 안시켰는데 b를 주문했으면 No
if (sum_a < 20000 && cnt_b >= 1) result = "No";
// 20000원 이상 시켰으면 b 가격까지 더하기
else {
total = sum_a + sum_b;
// 50000원 이상 안시켰는데 c를 주문했으면 No
if(total < 50000 && cnt_c >= 1) result = "No";
// 50000원 이상 시켰는데 c를 2개이상 시켰으면 No
else if (total >= 50000 && cnt_c >= 2 ) result = "No";
}
// 나머지는 okay
// 최종 결과 출력
cout << result;
result라는 string을 "Okay"로 초기화 하고 if 문을 통해서 주문법을 어기는 경우에 result = "No"로 바꿔줍니다.
전체코드
#include<iostream>
#include<vector>
#include<map>
#include<set>
using namespace std;
int main() {
vector<string> order_list;
map<string, long long> a;
map<string, long long> b;
set<string> c;
// 메뉴판 A, B, C 의 개수 입력받기
int na, nb, nc; cin >> na >> nb >> nc;
string tmp_str = "";
long long tmp_int = 0;
// 메뉴판 입력 받기
for(int i = 0; i< na; i++) {
cin >> tmp_str >> tmp_int;
a[tmp_str] = tmp_int;
}
for (int i = 0; i < nb; i++) {
cin >> tmp_str >> tmp_int;
b[tmp_str] = tmp_int;
}
for (int i = 0; i < nc; i++) {
cin >> tmp_str;
c.insert(tmp_str);
}
// 주문표 입력 받기
int order; cin >> order;
while (order--) {
cin >> tmp_str;
order_list.push_back(tmp_str);
}
// 주문표 속 A, B 시킨 가격, B, C 시킨 횟수 구하기
long long sum_a = 0;
long long sum_b = 0;
int cnt_b = 0;
int cnt_c = 0;
for (auto food : order_list) {
if (a.find(food) != a.end()) {
sum_a += a[food];
}
else if (b.find(food) != b.end()) {
sum_b += b[food];
cnt_b++;
}
else cnt_c++;
}
// 구한 4가지 변수를 이용해서 주문법을 잘 지켰는지 판별
long long total;
string result = "Okay";
// 20000원 이상 안시켰는데 b를 주문했으면 No
if (sum_a < 20000 && cnt_b >= 1) result = "No";
// 20000원 이상 시켰으면 b 가격까지 더하기
else {
total = sum_a + sum_b;
// 50000원 이상 안시켰는데 c를 주문했으면 No
if(total < 50000 && cnt_c >= 1) result = "No";
// 50000원 이상 시켰는데 c를 2개이상 시켰으면 No
else if (total >= 50000 && cnt_c >= 2 ) result = "No";
}
// 나머지는 okay
// 최종 결과 출력
cout << result;
}
'Koala - 2기 > B반' 카테고리의 다른 글
[2156번] 포도주 시식 (0) | 2021.02.08 |
---|---|
KOALA B반 - 2.4 미팅 (0) | 2021.02.05 |
[1269번] 대칭 차집합 (0) | 2021.02.02 |
[1806] 부분합 (0) | 2021.02.01 |
KOALA B반 - 2.1 미팅 (0) | 2021.02.01 |