[CDT - Javascript] 프로그래머스 연습문제 @ 시소 짝궁

김현수·2024년 1월 11일
0

cdt

목록 보기
47/51


🖋️ 시소 짝궁


# 문제 설명

시소 짝꿍이 최대 몇 쌍 존재하는지 구하기

  • 조건

    • 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의
      지점에 좌석이 하나씩 존재
    • 두 명이 마주 보고 탄다고 할 때,
      완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍

    • 즉, 탑승한 사람의 무게와 시소 축과
      좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍
  • 매개 변수

    • 사람들의 몸무게 목록 weights
  • 반환값

    • 시소 짝꿍이 몇 쌍 존재하는지 구하여 return

  • 📢 제한사항

    • 2 ≤ weights의 길이 ≤ 100,000
    • 100 ≤ weights[i] ≤ 1,000
      • 몸무게 단위는 N(뉴턴)으로 줌
      • 몸무게는 모두 정수

  • 📰 입출력 예시

weightsresult
[100,180,360,100,270]4



  • 실패한 CODE

function solution(weights) {
    const answer = [];
    
    // 짝궁 최대 몇 쌍
    for (let i = 0; i < weights.length; i++) {
        
        const cur = weights[i];
        for (let j = i+1; j < weights.length; j++) {
            const last2 = cur * 2 % weights[j];
            const last3 = cur * 3 % weights[j];
            const last4 = cur * 4 % weights[j];
                
            if (!last2 || !last3 || !last4) {
                answer.push([weights[i], weights[j]]);
            }
        }
    }
    
    return answer.length;
}

  • 성공한 CODE

function solution(weights) {
    let pairsCount = 0;
    const weightsCounter = {};
    const weightRatios = [1, 3 / 2, 2, 4 / 3];

    weights.sort((a, b) => b - a).forEach(weight => {
        weightRatios.forEach(ratio => {
            const scaledWeight = weight * ratio;
            if (weightsCounter[scaledWeight]) {
                pairsCount += weightsCounter[scaledWeight];
            }
        });

        weightsCounter[weight] = (weightsCounter[weight] || 0) + 1;
    });

    return pairsCount;
}

풀이

  • 가중치를 통해 solution 구하기

  • 특정 비율 조건을 충족하는 가중치 쌍의 수를 계산
  • 정렬은 모든 잠재적 쌍이 계산되도록 보장

  • 가중치 배열을 사용하고 미리 정의된
    4개의 비율에 대해 각 가중치를 확인

  • 비율 중 하나를 곱한 가중치가
    배열의 다른 가중치와 일치하면 이를 쌍으로 계산
profile
일단 한다

0개의 댓글