프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

  • 서로 같은 거리에서 토크 값이 같으려면 몸무게의 비율 = 1:1
  • 2m, 4m 거리에서 토크 값이 같으려면 몸무게의 비율 = 1:2
  • 2m, 3m 거리에서 토크 값이 같으려면 몸무게의 비율 = 3:2 = 1:3/2
  • 3m, 4m 거리에서 토크 값이 같으려면 몸무게의 비율 = 4:3 = 1:4/3

> 특정 인원의 몸무게를 weight라 할 때 weight값의 1:1, 1:2, 1:3/2, 1:4/3에 해당하는 값이 존재하는지 확인해야함

> weightA와 weightB가 다른 경우에는 단순히 weightB에 해당하는 인원 수를 answer에 더하면 되지만 같은 경우에는 중복을 제거하기 위해 n명 중에서 2명을 뽑는 경우의 수 식을 이용해야함

 

#include <string>
#include <vector>

using namespace std;

long long solution(vector<int> weights) {
    long long answer = 0;
    // 각 몸무게에 해당하는 인원 수 저장용 배열
    vector<long long> count(1001, 0);
    long long weight = 0;
    
    // index을 몸무게로 가지는 인원의 수를 저장
    for(int i = 0; i < weights.size(); i++) {
        count[weights[i]]++;
    }
    
    // 특정 몸무게가 2명 이상일 경우 n(n-1)/2 식을 통해 짝의 수를 구함
    for(int i = 100; i < 1001; i++) {
        if(count[i] >= 2) {
            answer += (count[i] * (count[i] - 1)) / 2;
        }
    }
    
    //weight의 1:2, 1:3/2, 1:4/3에 해당하는 몸무게를 가지는 인원 수를 구해서 짝을 만듦
    for(int i = 0; i < weights.size(); i++) {
        // 1:2
        weight = weights[i] * 2;
        if(weight <= 1000) answer += count[weight];
        
        // 2:3
        if(weights[i] % 2 == 0) {
            weight = weights[i] * 3 / 2;
            if(weight <= 1000) answer += count[weight];
        }
        
        // 3:4
        if(weights[i] % 3 == 0) {
            weight = weights[i] * 4 / 3;
            if(weight <= 1000) answer += count[weight];
        }
    }
    
    return answer;
}

+ Recent posts