프로그래머스 시소 짝꿍 JavaScript

2023년 1월 24일

프로그래머스 시소 짝꿍

문제 풀이

시소의 중심으로부터 2m, 3m, 4m 거리의 지점에 좌석이 하나씩 있다. 이 시소를 두 명이 마주 보고 탈 때, 완전한 균형을 이룰 수 있다면 시소 짝꿍이라고 한다.
(무게와 시소 축과 좌석 간의 거리의 곱이 양쪽이 같다 => 시소 짝꿍)
시소 짝꿍이 될 수 있는 경우는 (두 사람이 무게가 w1, w2일 때)

  • 무게가 같은 경우
  • w1 * 2 = w2 * 3
  • w1 * 2 = w2 * 4
  • w1 * 3 = w2 * 2
  • w1 * 3 = w2 * 4
  • w1 * 4 = w2 * 2
  • w1 * 4 = w2 * 3

총 7가지의 경우가 있다. weights의 길이가 최대 100,000이기에 이중 for 문을 사용하면 시간 초과에 걸린다. 시간 초과를 피하기 위해 자료구조 map을 이용해 [무게: 사람 수] 형태로 저장한다.

그다음 weights를 순서대로 w1로 넣어 시소 짝꿍이 될 수 있는 경우인지 확인한다. (예: w1 * 2 / 3 = w2)
같은 무게가 2명 이상 있다면 사람 수 - 1 만큼 시소 짝꿍을 카운트하고 그 무게의 map 값에 -1 해준다.

weights가 (100, 100, 100) 인 경우 map.get(100) = 3이다.

  • 인덱스가 0일 때 계산하면 시소 짝꿍 += 2, map.get(100) = 2 가 된다.
  • 인덱스가 1일 때 계산하면 시소 짝꿍 += 1, map.get(100) = 1 이 된다.
  • 인덱스가 2일 때 map.get(100) = 1이기에 map.delete(100)를 하고 종료한다.
  • 시소 짝꿍의 수 = 3
solution.js
function solution(weights) {
    let answer = 0;
    const map = new Map();
    weights.forEach((w) => {
        map.has(w) ? map.set(w, map.get(w) + 1) : map.set(w, 1);
    })
    
    weights.forEach((w) => {
        if (map.get(w*2/3)) {
            answer+=map.get(w*2/3);
        }
        if(map.get(w*2/4)) {
            answer+=map.get(w*2/4);
        }
        if(map.get(w*3/2)) {
            answer+=map.get(w*3/2);
        }
        if(map.get(w*3/4)) {
            answer+=map.get(w*3/4);
        }
        if(map.get(w*4/2)) {
            answer+=map.get(w*4/2);
        }
        if(map.get(w*4/3)) {
            answer+=map.get(w*4/3);
        }

        if (map.get(w) > 1) {
            answer += map.get(w)-1;
            map.set(w, map.get(w)-1)
        }
        else{
            map.delete(w);
        }
    })
    return answer;
}

댓글