코딩테스트

[JS] 시소 짝꿍

미안하다 강림이 좀 늦었다 2024. 5. 7. 17:06

 

 

난이도: Lv. 2

정답률: 49%

문제: https://school.programmers.co.kr/learn/courses/30/lessons/152996

 

프로그래머스

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

programmers.co.kr

 

 

알고리즘

  1. duplication 맵과 cases 맵을 선언 한다.
    • duplication 맵은 key를 몸무게, value를 그 몸무게를 가진 사람의 수로 한다. 중복을 체크하기 위한 맵이다.
    • cases 맵은 몸무게에 x2, x3, x4를 계산한 값을 key로 가지고, 해당 값이 몇 개인지를 value로 가진다.
  2. 파라미터로 주어진 weights 배열을 순회한다.
    1. duplication에 존재하는 무게인지 확인하고, value를 설정한다.
    2. x2, x3, x4한 값을 차례로 cases에 넣고, value를 가져온다.. 중복된 몸무게라면 cases의 value에서 2-1에서 구한 value의 값을 뺀 결과를 answer에 더하고, 중복된 몸무게가 아니라면 cases의 value를 answer에 더한다.

 

 

코드

function solution(weights) {
    let answer = 0;
    const duplication = new Map();
    const cases = new Map();
    const distance = [2, 3, 4];

    for(let weight of weights) {
        const duplicationCount = duplication.get(weight);
        if(duplicationCount) {
            duplication.set(weight, duplicationCount + 1);
            answer += duplicationCount;
        } else {
            duplication.set(weight, 1);
        }

        for(let d of distance) {
            const multipleWeight = weight * d;
            const caseCount = cases.get(multipleWeight)

            if(caseCount) {
                cases.set(multipleWeight, caseCount + 1);
                answer += duplicationCount ? (caseCount - duplicationCount) : caseCount;
            } else {
                cases.set(multipleWeight, 1);
            }
        }
    }

    return answer;
}

 

 

주저리

무수한 착각의 1시간 반을 보냈다. 100N인 사람이 세명이면 결과가 1이어야 하는가 3이어야 하는가에 대해 한참 고민하다가 테케 결과 보니까 후자가 맞는 것 같았다. 그걸 깨달았음에도 불구하고 중복을 어떻게 제거해야 하는지 감이 안 와서 또 한참 고민하다가 어부지리로 깨달아서 겨우 풀었다. 멘토링하러 간다고 마음 급해서 글도 잘 안 써짐^^..........