console.log

[PRG] 152996 시소 짝꿍 JAVA 본문

알고리즘/프로그래머스

[PRG] 152996 시소 짝꿍 JAVA

foresight 2023. 9. 7. 00:35

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

프로그래머스

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

programmers.co.kr

 
메모리: 76.6 MB
실행시간: 0.11 ms
 

문제분석

배열을 순회하며 짝꿍을 찾는다 !

이때 중요한 것은 같은 몸무게의 사람이 존재하는지, 
또한 그 사람들을 제외하고 2배, 3배, 4배에 겹치는 사람과 짝을 이루는 것 !

 

걸린시간

1시간 ⏱️

 

풀이방법

a : 원본 몸무게 카운트 할 배열 [1001]
b : 2,3,4배 몸무게 카운트 할 배열 [4001]

1.  weights 배열 순회하기
2.  현재 사람의 몸무게가 a에 있는지 체크
3.  2가 true : 2에 해당되는 만큼 ++, 현재 사람의 몸무게 2,3,4배가 2에 해당되는거 말고도 b에 있는 만큼 ++
    2가 false : 현재 사람의 몸무게 2,3,4배가 b에 있는 만큼 ++
4.  현재 사람의 몸무게에 따라 a와 b에 카운트 더하기

 

포인트

쌍을 카운트 할 때에는 중복을 조심해야 한다 !
하지만, 내가 생각한 방법대로 하면 앞에서부터 순회하며 카운트하기 때문에
중복이 발생하지 않는다 !

왜냐하면 ... 앞에서 등록된 사람의 몸무게만 판별하기 때문에
앞에서 뒷 사람을 체크하지 못했다면 뒤에서 체크한다 !

 

코드

class Solution {
    public long solution(int[] weights) {
        long answer = 0;

        // 카운트 배열 생성
        long[] cntWeight = new long[1001];  // 몸무게 원본 저장
        long[] cntMul = new long[4001];     // 몸무게 배수 저장

        // weights 배열 순회
        for(int i = 0; i < weights.length; i ++) {
            // 현재 사람의 몸무게 체크
            long temp = cntWeight[weights[i]];
            int m2 = weights[i] * 2;
            int m3 = weights[i] * 3;
            int m4 = weights[i] * 4;
            if(temp > 0) { // 앞에서 같은 몸무게가 있었다면
                // 그 사람 수 만큼 카운트 ++
                answer += temp;
                // 몸무게 2, 3, 4배 체크하기
                answer += cntMul[m2] - temp;
                answer += cntMul[m3] - temp;
                answer += cntMul[m4] - temp;
            } else {                        // 앞에서 같은 몸무게가 없었다면
                answer += cntMul[m2];
                answer += cntMul[m3];
                answer += cntMul[m4];
            }

            // 배열에 카운트 더하기
            cntWeight[weights[i]] ++;
            cntMul[m2] ++;
            cntMul[m3] ++;
            cntMul[m4] ++;
        }

        return answer;
    }
}