본문 바로가기
알고리즘/백준

[백준 17479] 정식당 (C++)

by fortissimo 2024. 10. 16.

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

문제


2019년 1학기가 시작되고 많은 사람을 만나며 밥과 술에 탕진을 해버린 영기는 2학기에 탕진할 돈을 마련하기 위해 중앙대 근처의 고급 레스토랑, "정식당"에서 알바를 하게 되었다.

정식당의 사장 정우는 새로 들어온 알바생 영기를 위해 정식당만의 특별한 음식 주문법을 알려주려고 한다.

정식당에는 다양한 메뉴들이 있지만 크게 3가지로 나눌 수 있는데 A개의 "일반메뉴", B개의 "특별메뉴", C개의 "서비스메뉴"로 나뉘어져 있다. 일반메뉴는 자유롭게 주문할 수 있으나 특별메뉴와 서비스메뉴는 주문할 때 다음의 제약이 있다.

  • 특별메뉴는 일반메뉴에서 총 20,000원 이상을 주문해야 주문할 수 있다.
  • 서비스메뉴는 일반메뉴와 특별메뉴에서 총 50,000원 이상을 주문해야 주문할 수 있다.
  • 서비스메뉴는 단 하나만 주문할 수 있다.

다양한 메뉴와 특별한 메뉴 주문법에 영기는 알바를 하면서 혼돈이 오기 시작했다. 받아서는 안될 주문을 받기도 하며 사장님에게 된통 혼나기도 하며 심지어는 자기 발에 걸려 넘어지기까지 했다.

가게를 찾아온 손님들이 주문하는 것이 옳은 주문인지 아닌지 헷갈려하는 영기는 우리에게 도움을 요청했다. 영기가 주문을 잘 받아올 수 있도록 우리가 도와주자.

 

입력


첫째 줄에 50,000 이하의 양의 정수 A, B, C가 공백을 두고 주어진다.

두번째 줄부터 A줄에 걸쳐 일반메뉴의 이름과 가격이 공백을 두고 주어진다. 그 다음 B줄에 걸쳐 특별메뉴의 이름과 가격이 공백을 두고 주어진다. 그 다음 C줄에 걸쳐 서비스메뉴의 이름이 주어진다.

그 다음 줄에서 손님이 주문하는 음식의 수를 나타내는 150,000 이하의 자연수 N이 주어진다.

그 다음 N줄에 걸쳐 손님이 주문하는 음식의 이름들이 주어진다. 같은 음식을 여러번 주문할 수도 있으며 메뉴에 있는 음식만 주문한다.

일반메뉴와 스페셜메뉴의 가격은 1,000,000 이하의 양의 정수이며 메뉴의 이름은 20자 이하의 알파벳 소문자로만 이루어져 있으며 일반메뉴, 특별메뉴, 그리고 서비스메뉴들의 이름은 모두 다르다

 

출력


영기가 받은 주문이 옳은 주문이면 "Okay"를, 그렇지 않은 주문이라면 "No"를 출력하자. 따옴표는 출력하지 않는다.

 

문제 풀이


구현 문제.

 

map과 set을 이용하여 일반 메뉴, 스페셜 메뉴, 서비스 메뉴들의 데이터를 저장해준다. 일반메뉴와 스페셜 메뉴는 가격이 있으므로 map을, 서비스 메뉴는 set을 사용해주면 된다. 일반 메뉴와 스페셜 메뉴는 가격이 제대로 된 조건인지 확인해야하고, 서비스 메뉴는 주문 개수가 제대로 된 조건인지 확인해야 한다.

손님이 주문하는 음식을 입력받을 때 해당 음식이 일반 메뉴인지, 스페셜 메뉴인지, 서비스 메뉴인지 체크하고 일반 메뉴와 스페셜 메뉴라면 각각 변수에 해당 가격만큼 증가시킨다. 서비스 메뉴라면 개수를 1 증가시켜주면 된다.

 

스페셜 메뉴가 1개라면 일반 메뉴와 스페셜 메뉴 둘 다 주문하는 경우와, 일반 메뉴만 주문하는 경우가 있다.

    둘 다 주문하면 일반 메뉴는 20000원을 넘겨야 하고, 일반과 스페셜을 합쳐 50000원을 주문해야 한다.

    일반 메뉴만 주문하면 일반 메뉴만 50000원을 넘기면 된다. 나머지는 주문할 수 없는 경우이다.

스페셜 메뉴를 주문하지 않았다면 일반 메뉴와 스페셜 메뉴를 동시에 주문하는 경우와, 일반 메뉴만 주문하는 경우가 있다.

    두 개를 동시에 주문했다면 일반 메뉴가 20000원을 넘기면 된다.

    일반 메뉴만 주문하면 제약 조건이 없다.

스페셜 메뉴를 2개 이상 주문했다면 주문이 불가능한 경우이다.

 

위의 경우를 구현해주면 된다.

 

아래는 코드.

더보기
#include <iostream>
#include <map>
#include <set>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	int A, B, C, N;
	string menu;
	int price;
	long long normalPrice = 0;
	long long specialPrice = 0;
	int serviceMenuCount = 0;
	cin >> A >> B >> C;
	map<string, int> normal;
	map<string, int> special;
	map<string, int>::iterator it;
	set<string> service;
	for (int i = 0; i < A; i++)
	{
		cin >> menu >> price;
		normal.insert({ menu, price });
	}
	for (int i = 0; i < B; i++)
	{
		cin >> menu >> price;
		special.insert({ menu, price });
	}
	for (int i = 0; i < C; i++)
	{
		cin >> menu;
		service.insert(menu);
	}
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> menu;
		it = normal.find(menu);
		if (it != normal.end())
		{
			normalPrice += it->second;
			continue;
		}
		it = special.find(menu);
		if (it != special.end())
		{
			specialPrice += it->second;
			continue;
		}
		serviceMenuCount++;
	}
	if (serviceMenuCount == 1)
	{
		if (specialPrice != 0 && normalPrice >= 20000 && specialPrice + normalPrice >= 50000)
		{
			cout << "Okay" << "\n";
		}
		else if (specialPrice == 0 && normalPrice >= 50000)
		{
			cout << "Okay" << "\n";
		}
		else
		{
			cout << "No" << "\n";
		}
	}
	else if (serviceMenuCount==0)
	{
		if (specialPrice != 0 && normalPrice >= 20000)
		{
			cout << "Okay" << "\n";
		}
		else if (specialPrice == 0)
		{
			cout << "Okay" << "\n";
		}
		else
		{
			cout << "No" << "\n";
		}
	}
	else
	{
		cout << "No" << "\n";
	}
	return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준 14562] 태권왕 (C++)  (0) 2024.10.18
[백준 3020] 개똥벌레 (C++)  (0) 2024.10.17
[백준 2567] 색종이 - 2 (C++)  (0) 2024.10.15
[백준 2331] 반복수열 (C++)  (0) 2024.10.14
[백준 13335] 트럭 (C++)  (0) 2024.10.13