프로그래머스 시소 짝궁

피나코·2023년 1월 19일
1

알고리즘

목록 보기
34/46
post-thumbnail

프로그래머스 시소 짝궁 바로가기

문제 설명

어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.

이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.

사람들의 몸무게 목록 weights 이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.

접근 방식

구현 + 맵 자료구조를 이용해서 풀었다.

그리고 weights의 범위가 100,000이라서 무조건 반복은 한 번 돌아야 한다고 생각했다.

  1. Map< Integer(무게), List(사람 인덱스) > 를 만들어준다
{100=[0, 3], 180=[1], 360=[2], 270=[4]} 

이런식으로 데이터가 담긴다

  1. weights 배열에서 중복을 제거한 set을 토대로 반복을 돌린다

  2. 반복 하면서 확인해줘야 할 것은 7가지이다. 표를 보며 쉽게 이해해보자

    x2x3x4
    x2중복key x 2 ÷ 3key x 2 ÷ 4
    x3key x 3 ÷ 2중복key x 3 ÷ 4
    x4key x 4 ÷ 2key x 4 ÷ 3중복

    중복 칸을 제외하고는 무조건 다른 값이 나오게 되어있다. 그래서 총 7가지만 비교해주면 된다.

  3. 반복을 돌면서, 예를들어 100의 몸무게에서 나올 수 있는 균형을 다 세고나면 맵에서 key 100을 삭제해준다. 앞으로 다시 체크할 필요가 없기 때문이다.

코드

import java.util.*;

class Solution {
    
    public long solution(int[] weights) {
        long answer = 0;
        
        Map<Integer, List<Integer> > hm = new HashMap<>();
        
        Set<Integer> mySet = new HashSet<>();
        
        int leng = weights.length;
        
        for(int i = 0 ; i < leng; i++){
            if(!hm.containsKey(weights[i])){
                List<Integer> myList = new ArrayList<>();
                myList.add(i);
                hm.put(weights[i], myList);
            }
            else{
                hm.get(weights[i]).add(i);
            }
            mySet.add(weights[i]);
        }  

        for(int key : mySet){
        
            int dupli = hm.get(key).size();
            
            int wX2 = key * 2;
            if(wX2 % 3 == 0) {
                if(hm.containsKey(wX2 / 3)){
                    answer += (long)hm.get(wX2/3).size() * dupli;
                }
            }
            
            if(wX2 % 4 == 0) {
                if(hm.containsKey(wX2 /4)){
                    answer += (long)hm.get(wX2/ 4).size() * dupli;
                }
            }
            
            int wX3 = key * 3;
            if(wX3 % 2 == 0) {
                if(hm.containsKey(wX3 / 2)){
                    answer += (long)hm.get(wX3/2).size() * dupli;
                }
            }
            
            if(wX3 % 4 == 0) {
                if(hm.containsKey(wX3 /4)){
                    answer += (long)hm.get(wX3/ 4).size() * dupli;
                }
            }
            
            int wX4 = key * 4;
            if(wX4 % 2 == 0) {
                if(hm.containsKey(wX4 / 2)){
                    answer += (long)hm.get(wX4/2).size() * dupli;
                }
            }
            
            if(wX4 % 3 == 0) {
                if(hm.containsKey(wX4 /3)){
                    answer += (long)hm.get(wX4/ 3).size() * dupli;
                }
            }
            
            if(dupli > 1){
                answer += (long)dupli * (long)(dupli - 1) / 2;
            }
            
            hm.remove(key);
            
        }
        return answer;
    }
}

Disscussion

(long) 을 잘못 적용해줘서 통과하기까지 꽤 오래 걸렸다. 기초에 충실하자…ㅠㅡㅠ

profile
_thisispinako_

2개의 댓글

comment-user-thumbnail
2023년 1월 20일

덕분에 좋은 내용 잘 보고 갑니다.
정말 감사합니다.

1개의 답글