티스토리 뷰
#include <string>
#include <vector>
#include <map>
using namespace std;
long long solution(vector<int> weights) {
long long answer = 0;
map<int, long long>m;
for(int i=0; i<weights.size(); i++) m[weights[i]]++;
for(auto w : weights)
{
if(w%2==0)
{
long long num = w / 2 * 3;
answer += m[num];
}
if(w%3==0)
{
long long num = w / 3 * 4;
answer += m[num];
}
long long num = w * 2;
answer += m[num];
}
for(int i=100; i<=1000; i++)
{
if(m[i] >=2) answer += (m[i] * (m[i]-1)) / 2;
}
return answer;
}
문제에 주어진 경우의 수를 보면 (2, 3), (1, 2), (3, 4) 이렇게 3가지 케이스에 대해 검토해야 한다는 것을 알 수 있다.
같은 숫자 조합의 경우 조합 공식으로 갯수를 알 수 있기에 1개 이상인 경우를 찾기 위해 map으로 카운팅을 해주었다.
이후에는 현재 수를 기반으로 2로 나눠지면 2:3 비율 값이 Map에 있는 지 체크,
3으로 나눠지면 3:4 비율 값이 Map에 있는 지 체크,
그리고 마지막 1:2 비율 값이 있는지 체크하여 있다면 해당 수의 갯수만큼 저장하게 된다.
그리고 마지막으로 같은 수에 대해 선택하는 경우의 수를 고르기 위한 조합 공식 (n*(n-1))/2 을 통해 최종 가짓수를 더한다.
'프로그래머스 > 2레벨' 카테고리의 다른 글
[프로그래머스 2레벨] 미로 탈출 (C++) (0) | 2025.02.23 |
---|---|
[프로그래머스 2레벨] 숫자 카드 나누기 (C++) (0) | 2025.02.19 |
[프로그래머스 2레벨] 124나라의 숫자 (C++) (0) | 2025.02.18 |
[프로그래머스 2레벨] 호텔 대실 (C++) (0) | 2025.02.17 |
[프로그래머스 2레벨] 전력망을 둘로 나누기 (C++) (0) | 2025.02.14 |