알고리즘 공부/C++
[S4] 백준 26596번 황금 칵테일 C++ 해시를 사용한 집합과 맵
마달랭
2024. 9. 10. 17:14
리뷰
5달만에 다시 덤볐으나 문제 조건을 제대로 읽지 않아 또 져버렸다...
https://www.acmicpc.net/problem/26596
문제 풀이
- 재료의 개수 m과 황금 비율을 비교할 gold_rate를 1.618로, 문자열, 정수로 이루어진 맵 dic를 초기화 해준다.
- m값을 입력 받고 m만큼 루프를 돈 뒤 재료명과 값을 입력받아 재료명을 키로 갖는 맵에 값을 더해준다.
- flag를 0으로 초기화 해주고 맵을 두개로 나누어 순회하며 특정 재료의 값 * 황금비율이 다른 재료의 값과 동일한지 찾아준다. 이때 재료가 동일한 경우에는 황금 비율로 인정하지 않는다.
- 만약 황금 비율을 찾았다면 flag를 1로 변경한 후 break 처리를 해준다.
- flag가 1인 경우 Delicious! 를, 아닐 경우 Not Delicious...를 출력해 준다.
참고 사항
val1과 val2가 동일한 값을 가질때 continue가 아닌 동일한 재료명일때 continue 처리를 해주어야 한다.
예시로 Cola = 1, Cider = 1 일 경우 왼쪽의 케이스에서는 황금비율이 인정된다.
정답 코드
#include<iostream>
#include<unordered_map>
using namespace std;
int m;
const double gold_rate = 1.618;
unordered_map<string, int> dic;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> m;
while (m--) {
string s; int v; cin >> s >> v;
dic[s] += v;
}
int flag = 0;
for (auto& val1 : dic) {
for (auto& val2 : dic) {
if ((int)(val1.second * gold_rate) == val2.second) {
if (val1.first == val2.first) continue;
flag = 1;
break;
}
}
if (flag) break;
}
if (flag) cout << "Delicious!";
else cout << "Not Delicious...";
}
728x90