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

 

이번에 볼 문제는 백준 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(M^2)\) 브루트포스로 문제를 충분히 해결할 수 있다.

 

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

 

\(\lfloor a_i*1.618\rfloor\)의 계산은 단순히 \(a_i\)에 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