※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 26596번 문제인 황금 칵테일이다.
문제는 아래 링크를 확인하자.

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

 

26596번: 황금 칵테일

Vodka가 총 150, Cola가 총 242 들어갔고 $\lfloor150 * 1.618\rfloor = \lfloor242.7\rfloor=242$ 이므로 두 재료가 서로 황금비를 이뤄 맛있는 황금 칵테일이 된다.

www.acmicpc.net

 

칵테일에 들어간 서로 다른 두 재료의 비율이 문제의 조건을 만족하는 경우가 있는지를 확인하는 문제이다.

 

가능한 재료의 종류는 최대 M가지로 충분히 적다. 따라서 가능한 모든 재료 쌍을 직접 살펴 비율이 조건을 만족하는지 확인하는 O(M2) 브루트포스로 문제를 충분히 해결할 수 있다.

 

같은 재료를 여러 번 섞었을 수 있으므로 각 재료의 양을 map을 이용해 관리해주자.

 

ai1.618의 계산은 단순히 ai에 1618을 곱한 뒤 1000으로 나눈 몫을 계산하는 것으로 실수연산 없이 해낼 수 있으니 참고하자.

 

같은 두 재료의 비율을 계산하지 않도록 유의하자. 예를 들어 어떤 재료의 양이 1이고 나머지 재료의 양이 1이 아닐 때 해당 재료를 두 재료로 생각해 판단하는 일이 발생하지 않도록 유의하자. 물론 서로 다른 재료의 양이 각각 1인 경우는 고려해주어야 한다.

 

아래는 제출한 소스코드이다.

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

int N;
map<string, int> mp;
vector<int> vec;

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

	cin >> N;
	while (N--) {
		string s; int x; cin >> s >> x;
		if (mp.count(s)) mp[s] += x;
		else mp.insert(make_pair(s, x));
	}

	for (auto &p : mp) vec.emplace_back(p.second);
	int N = vec.size();
	for (int i = 0; i < N; i++) {
		int xx = vec[i] * 1618 / 1000;
		for (int j = 0; j < N; j++) {
			if (i == j) continue;
			int y = vec[j];
			if (xx == y) {
				cout << "Delicious!";
				return 0;
			}
		}
	}

	cout << "Not Delicious...";
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 29704 // C++] 벼락치기  (0) 2024.03.10
[BOJ 26975 // C++] Cow College  (0) 2024.03.09
[BOJ 28446 // C++] 볼링공 찾아주기  (0) 2024.03.07
[BOJ 26267 // C++] 은?행 털!자 1  (0) 2024.03.06
[BOJ 20157 // C++] 화살을 쏘자!  (1) 2024.03.05

+ Recent posts