본문 바로가기
Algorithm/Programmers Java

Java 프로그래머스 시소 짝꿍

by 제우제우 2024. 2. 28.

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

 

프로그래머스

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

programmers.co.kr

문제 분류 : 코딩테스트 연습 > 연습문제 > 시소 짝꿍

난이도 : 2

 

문제 접근 

시소의 좌석은 2(m) , 3(m) , 4(m) 이렇게 3개가 있다.

 

짝꿍의 경우의 수 

2(m) 2(m) 좌석에 앉는 경우

2(m) 3(m) 좌석에 앉는 경우

2(m) 4(m) 좌석에 앉는 경우

3(m) 2(m) 좌석에 앉는 경우

3(m) 3(m) 좌석에 앉는 경우

3(m) 4(m) 좌석에 앉는 경우

4(m) 2(m) 좌석에 앉는 경우

4(m) 3(m) 좌석에 앉는 경우

4(m) 4(m) 좌석에 앉는 경우

이렇게 있다. 

 

1. HashMap에 key를 몸무게 value를 key가 몸무게인 사람들 숫자를 기록한다.

2. HashMap을 Iterator로 만든다. (Map.Entry) 

3. Iterator를 전체를 확인한다. 

     1) 같은게 있는지?

     ex)  2m 인 사람이 3명이 있다. 그럼 key는 2 value는 3 이다.

     그럼 3명에서 나올 수 있는 짝꿍의 개수는 2 + 1 이다. 

     2) 1번에서는 같은 경우를 확인 했다. 

       남은 경우는 2m 3m에 앉는 경우 2m 4m에 앉는 경우 3m 4m에 앉는 경우도 확인해서 계산한다. 

 

정답 코드

import java.util.*;
class Solution {
    public long solution(int[] weights) { 
        long answer = 0;
        HashMap<Long, Long> map = new HashMap<>();
        for(int i = 0; i < weights.length; i++){
            long target = weights[i];
            map.put(target, (long)map.getOrDefault(target, (long)0)+ 1);
        }
        // (2, 3), (2, 4), (3, 4) or same 
        Iterator<Map.Entry<Long, Long>> it = map.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry<Long, Long> entry = it.next();
            long target = entry.getKey();
            long num    = entry.getValue();
            // 먼저 같은게 있는지? 
            if(num >= 2){
                long temp = num;
                temp--;
                while(temp != 0){
                    answer += temp;
                    temp--;
                }
            }
            if((target * 2) % 3 == 0){
               answer += num * map.getOrDefault(target * 2 / 3, (long)0); 
            }
            if((target * 2) % 4 == 0){
               answer += num * map.getOrDefault(target * 2 / 4, (long)0); 
            }
            if((target * 3) % 4 == 0){
               answer += num * map.getOrDefault(target * 3 / 4, (long)0); 
            }  
        }
        return answer;
        
    }
}