본문 바로가기

백준

백준17479 - 정식당

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

 

17479번: 정식당

일반메뉴는 noodle 2개로 20,000원, 특별메뉴는 cutlet 2개와 friedrice 1개로 32,000원, 둘이 합쳐 52,000원으로 서비스메뉴 하나를 주문할 수 있다.

www.acmicpc.net

생각보다 조건이 까다로웠던 문제다. 음식의 이름별로 어떤 종류의 메뉴인지 분류하였다가 반복문을 이용하여 해당하는 메뉴의 가격을 더하였다. 주의할 점은 A, B, C를 모두 안 시키는 경우가 있을 수 있다는 것이다. 각각 종류별로 하나씩 시켜도 되고 두 개씩 시켜도 되고 세 개씩 시켜도 된다. 

 

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main() {
	int x, y, z; //A메뉴의 갯수, B메뉴의 갯수, C메뉴의 갯수
	int w; //주문한 메뉴의 수
	long long int cost; //음식 가격
	long long int cnt_A = 0, cnt_B = 0, cnt_C = 0; //주문한 A메뉴의 총 가격, 주문한 B메뉴의 총 가격, 주문한 서비스 메뉴의 갯수
	string s; //음식의 이름
	vector<pair<string, char>> v; //메뉴의 이름과 종류를 저장할 공간
	map<string, int> mp_A; //A메뉴의 종류에 따른 가격
	map<string, int> mp_B; //B메뉴의 종류에 따른 가격

	//메뉴별로 가격을 나타냄, 서비스는 가격을 안 나타냄
	cin >> x >> y >> z;
	for (int i = 0; i < x; i++) { //A메뉴의 이름과 가격을 저장
		cin >> s >> cost;
		mp_A[s] = cost;
	}
	for (int i = 0; i < y; i++) { //B메뉴의 이름과 가격을 저장
		cin >> s >> cost;
		mp_B[s] = cost;
	}
	for (int i = 0; i < z; i++) { //c메뉴는 가격이 없기 때문에 저장하지 않고 받기만 한다.
		cin >> s;
	}

	
	cin >> w; //주문한 메뉴의 갯수
	for (int i = 0; i < w; i++) {
		cin >> s;
		if (mp_A.find(s) != mp_A.end()) { //입력한 매뉴가 A메뉴이면 메뉴 이름과 A메뉴를 같이 벡터에 집어넣는다.
			v.push_back(make_pair(s, 'A'));
		}
		else if (mp_B.find(s) != mp_B.end()) { //입력한 매뉴가 B메뉴이면 메뉴 이름과 B메뉴를 같이 벡터에 집어넣는다.
			v.push_back(make_pair(s, 'B'));
		}
		else { //입력한 매뉴가 C메뉴이면 메뉴 이름과 C메뉴를 같이 벡터에 집어넣는다.
			v.push_back(make_pair(s, 'C'));
		}
	}

	//메뉴가 들어왔을 때 무슨 메뉴인지 찾는다.
	for (int i = 0; i < w; i++) {
		if (v[i].second == 'A') { //A메뉴의 총 가격을 더한다.
			cnt_A = cnt_A + mp_A[v[i].first];
		}
		else if (v[i].second == 'B') { //B메뉴의 총 가격을 더한다.
			cnt_B = cnt_B + mp_B[v[i].first];
		}
		else {
			cnt_C++; //C메뉴의 갯수를 센다.
		}
	}

	if (cnt_A >= 20000 && cnt_A + cnt_B >= 50000 && cnt_C == 1) { //A가 20000원 이상, A와 B의 합이 50000원 이상, C가 1인 경우 참
		cout << "Okay";
	}
	else if (cnt_A >= 20000 && cnt_B != 0 && cnt_C == 0) { //A가 20000원 이상, B를 주문하고 C를 주문하지 않은 경우 참
		cout << "Okay";
	}
	else if (cnt_A != 0 && cnt_B == 0 && cnt_C == 0) { //A만 주문한 경우 참
		cout << "Okay";
	}
	else { //그 외의 경우는 모두 틀린 주문
		cout << "No";
	}
}

'백준' 카테고리의 다른 글

백준2865 - 나는 위대한 슈퍼스타K  (0) 2019.10.09
백준1138 - 한 줄로 서기  (0) 2019.10.09
백준1913 - 달팽이  (0) 2019.10.03
백준1507 - 궁금한 민호  (0) 2019.09.30
백준1038 - 감소하는 수  (0) 2019.09.26