몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 시소 짝꿍 {언어 : Java} 본문

알고리즘/풀었지만 다시 보기

프로그래머스 [Lv. 2] 시소 짝꿍 {언어 : Java}

스위태니 2024. 11. 15. 17:31

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

정답 코드

import java.util.*;

class Solution {
    public Map<Integer, Integer> Counter(int[] lst) {
        Map<Integer, Integer> dict = new HashMap<>();
        for (int n: lst) {
            if (dict.containsKey(n)){
                dict.put(n, dict.get(n) + 1);
            } else {
                dict.put(n, 1);
            }
        }
        return dict;
    }
    
    public long solution(int[] weights) {
        long answer = 0;
        Map<Integer, Integer> counter = Counter(weights);
        
        for (int k : counter.keySet()) {
            long cnt = counter.get(k);
            if (cnt >= 2) {
                answer += cnt * (cnt - 1) / 2;
            }
            if (k * 2 % 3 == 0 && counter.containsKey(k*2/3)) {
                 answer += cnt * (long) counter.get(k*2/3);
            }
            if (counter.containsKey(k*2)) {
                 answer += cnt * (long) counter.get(k*2);
            }
            if (k * 3 % 4 == 0 && counter.containsKey(k*3/4)) {
                 answer += cnt * (long) counter.get(k*3/4);
            } 
        }
        return answer;
    }
}

풀이 방법

  1. 몸무게를 key값으로 하는 map을 만든다.
    1. value는 해당 몸무게의 갯수가 된다.
  2. map에서 키 값들을 빼서 조건에 따라 answer에 값을 더해주면 된다.
    1. 현재 몸무게의 수가 2개 이상이라면 nC2 = (n * (n-1)) / 2를 answer에 더해준다.
    2. 2m와 3m에 각각 앉는 경우 (현재 몸무게) * 2 / 3이 map에 있다면 cnt와 곱해서 answer에 더해준다.
    3. 2m와 4m에 각각 앉는 경우 (현재 몸무게) * 2이 map에 있다면 cnt와 곱해서 answer에 더해준다.
      1. 이 조건문은 (현재 몸무게) / 2가 map에 있다면 cnt와 곱해서 answer에 더해줘도 된다.
      2. 하지만 앞에 조건이 하나 더 붙게 되므로 비효율적이다.
      3. (현재 몸무게) % 2 == 0과 같은 조건이 더 붙어야 한다.
    4. 3m와 4m에 각각 앉는 경우 (현재 몸무게) * 3 / 4이 map에 있다면 cnt와 곱해서 answer에 더해준다.
  3. anwer를 출력하면 끝!

느낀점

  • 다시 봐도 새롭다.
  • JavaScript로도 다시 풀어 봐야겠다.