티스토리 뷰

#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 을 통해 최종 가짓수를 더한다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함