알고리즘 공부/C++

[S4] 백준 26596번 황금 칵테일 C++ 해시를 사용한 집합과 맵

마달랭 2024. 9. 10. 17:14

리뷰

 

5달만에 다시 덤볐으나 문제 조건을 제대로 읽지 않아 또 져버렸다... 

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

 

문제 풀이

  1. 재료의 개수 m과 황금 비율을 비교할 gold_rate를 1.618로, 문자열, 정수로 이루어진 맵 dic를 초기화 해준다.
  2. m값을 입력 받고 m만큼 루프를 돈 뒤 재료명과 값을 입력받아 재료명을 키로 갖는 맵에 값을 더해준다.
  3. flag를 0으로 초기화 해주고 맵을 두개로 나누어 순회하며 특정 재료의 값 * 황금비율이 다른 재료의 값과 동일한지 찾아준다. 이때 재료가 동일한 경우에는 황금 비율로 인정하지 않는다.
  4. 만약 황금 비율을 찾았다면 flag를 1로 변경한 후 break 처리를 해준다.
  5. 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