※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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...";
}
'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 |