TIL_250429

듀듀·2025년 4월 29일

spring_TIL

목록 보기
51/53

시소 짝꿍

링크텍스트

문제 설명

  1. 어떠한 시소에 2,3,4 간격으로 좌석이 있다.

  2. 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍 = answer++

  3. answer 반환


시행착오 및 문제 풀이

사실 틀릴 거 예상하고 굉장히 원초적으로 풀어봤음

오답 코드

import java.util.*;
class Solution {
    public long solution(int[] weights) {
        long answer = 0;
        Arrays.sort(weights);
        
        for(int i=0; i<weights.length-1; i++) {
            int n1 = weights[i];
            int n2 = weights[i] * (2/3);
            int n3 = weights[i] * (3/4);
            int n4 = weights[i] * (2/4);
            
            for(int j=i; j<weights.length; j++) {
                if(weights[j] == n1) {
                    answer++;
                    break;
                }
                if(weights[j] == n2) {
                    answer++;
                    break;
                }
                if(weights[j] == n3) {
                    answer++;
                    break;
                }
                if(weights[j] == n4) {
                    answer++;
                    break;
                }
            }
        }
        return answer;
    }
}

예제코드만 통과함ㅎ

map을 사용한 풀이법으로 풀어야 함


정답 풀이

  1. 효율성을 위해 정렬

  2. 현재 몸무게에서 시소짝꿍이 되는 몸무게 찾기
    2-1. 같은 몸무게라면 똑같은 간격에 뒀을 때 시소짝꿍 = n1
    2-2. 2와 3의 지점에서 시소짝꿍이라면 x(2/3)해서 같으면 된다 = n2
    2-3. 3과 4의 지점에서 시소짝꿍이라면 x(3/4)해서 같으면 된다 = n3
    2-4. 2와 4의 지점에서 시소짝꿍이라면 x(2/4)해서 같으면 된다 = n4

  3. map에 있는지 확인. 있으면 answer에 map에 기록된 몸무게 갯수 추가. 없으면 map에 몸무게 갯수 추가

  4. answer 반환

ex) [100, 180, 360, 100, 270]
정렬 -> [100, 100, 180, 270, 360]

만약 w가 처음의 100일 때, map은 비어있으므로 바로 map에 넣어준다
-> map [100:1]

w가 그 다음의 100일 때, n1=100이고 n2,n3,n4는 map에 없다. n1은 map에 있으므로 2번째 100은 1번째 100과 시소짝꿍이다. answer에 더해준다.(answer = 1)
-> map [100:2]

w가 180일 때, n1=180, n2=120, n3=135, n4=90이다. 이 숫자들은 map에 존재하지 않으므로 map에는 나 자신인 180이 들어간다.
-> map [100:2, 180:1]

w가 270일 때, n1=270, n2=180, n3=202.5, n4=135이다. n2가 map에 있으므로 180과 270은 시소짝꿍이다. answer에 더해준다.(answer=2)
-> map [100:2, 180:1, 270:1]

w가 360일 때, n1=360, n2=240, n3=270, n4=180이다. n3와 n4가 map에 있으므로 360과 270은 시소짝꿍이다. 또, 360과 180도 시소짝꿍이다. answer에 더해준다. (answer=4)
-> map [100:2, 180:1, 270:1, 360:1]

=> answer = 4

map.put을 if절이 끝나고 마지막에 하는 이유: 처음부터 map에 넣고 시작하면 나 자신과 짝꿍이라 판단하기 때문에!

쉽게 생각해보자면 뒤에서부터 짝꿍을 찾아간다 생각하면 된다... (내피셜)

정답 코드

//*1, *2/3, *3/4, *2/4
import java.util.*;
class Solution {
    public long solution(int[] weights) {
        long answer = 0;
        
        Arrays.sort(weights);
        
        HashMap<Double, Integer> map = new HashMap<>();
        
        for(int w:weights) {
            //실수로 나눠줘야해서 소수점으로 계산
            double n1 = w*1.0;
            double n2 = w*(2.0/3.0);
            double n3 = w*(3.0/4.0);
            double n4 = w*(2.0/4.0);
            
            if(map.containsKey(n1)) {
                answer += map.get(n1);
            }
            if(map.containsKey(n2)) {
                answer += map.get(n2);
            }
            if(map.containsKey(n3)) {
                answer += map.get(n3);
            }
            if(map.containsKey(n4)) {
                answer += map.get(n4);
            }
            
            map.put(n1, map.getOrDefault(n1,0)+1);
        }
        
        return answer;
    }
}

정답~
이지만 여기서 젤 중요한 점

중요한 점

n1,n2,n3,n4는 double형이다. 왜? int형으로 하면 (3/4)이 정수가 되므로 0이 되어버린다. 그러면 틀린 계산이 된다.
실수(double)형으로 해서 (3/4)가 0이 아니라 0.75로 계산되게 만들어야 한다. 그러기 위해서 (3.0/4.0) 이런식으로 실수형 값을 곱해주었다.
이것땜시 오류났었다..!

0개의 댓글