포트폴리오목록으로

[level 2] 시소 짝꿍 - 152996

· Updated

문제 링크

성능 요약

메모리: 75.1 MB, 시간: 0.44 ms

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 07월 07일 21:45:16

문제 설명

어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해주세요.


제한 사항
  • 2 ≤ weights의 길이 ≤ 100,000
  • 100 ≤ weights[i] ≤ 1,000
    • 몸무게 단위는 N(뉴턴)으로 주어집니다.
    • 몸무게는 모두 정수입니다.

입출력 예
weightsresult
[100,180,360,100,270]4

입출력 예 설명

{100, 100} 은 서로 같은 거리에 마주보고 앉으면 균형을 이룹니다.
{180, 360} 은 각각 4(m), 2(m) 거리에 마주보고 앉으면 균형을 이룹니다.
{180, 270} 은 각각 3(m), 2(m) 거리에 마주보고 앉으면 균형을 이룹니다.
{270, 360} 은 각각 4(m), 3(m) 거리에 마주보고 앉으면 균형을 이룹니다.

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

풀이

Java

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 a = (double) w; // 현재 무게를 double형으로 변환하여 저장
            double b = ((double) w * 2.0) / 3.0; // 현재 무게의 2/3 값을 저장
            double c = (double) w / 2.0; // 현재 무게의 절반 값을 저장
            double d = ((double) w * 3.0) / 4.0; // 현재 무게의 3/4 값을 저장

            // map에 a가 존재하는 경우 answer에 해당 무게의 등장 횟수를 더함
            if(map.containsKey(a)) {
                answer += map.get(a);
            }
            
            // map에 b가 존재하는 경우 answer에 해당 무게의 등장 횟수를 더함
            if(map.containsKey(b)) {
                answer += map.get(b);
            }
            
            // map에 c가 존재하는 경우 answer에 해당 무게의 등장 횟수를 더함
            if(map.containsKey(c)) {
                answer += map.get(c);
            }
            
            // map에 d가 존재하는 경우 answer에 해당 무게의 등장 횟수를 더함
            if(map.containsKey(d)) {
                answer += map.get(d);
            }

            // 현재 무게 a의 등장 횟수를 1 증가시켜 map에 저장
            map.put(a, map.getOrDefault(a, 0) + 1);
        }
        
        return answer;
        
    }
    
}
privacy.md

개인정보 처리방침

이 사이트는 김상훈의 포트폴리오와 기술 블로그입니다. 회원가입, 댓글, 결제 기능은 제공하지 않습니다.

방문 분석

공식 운영 도메인에서 Google Analytics 4, Vercel Web Analytics와 Speed Insights를 사용해 페이지 방문, 유입 경로와 성능을 확인합니다. 개발·미리보기 환경에는 분석 도구를 활성화하지 않습니다.

Google Analytics는 브라우저 식별을 위해 쿠키를 사용할 수 있으며 페이지 URL, 브라우저·기기 정보와 상호작용을 처리합니다. URL과 입력 내용에 이름, 이메일 등 개인정보를 포함하지 마세요. 이 사이트는 이메일이나 연락처를 분석 이벤트로 직접 전송하지 않습니다.

Vercel 분석 도구는 방문 통계와 로딩·응답 성능을 처리합니다. Google과 Vercel의 실제 보관 기간 및 처리는 각 서비스 설정과 정책에 따릅니다.

외부 콘텐츠와 브라우저 저장

블로그에 포함된 외부 이미지는 해당 이미지 서버에서 불러오며 해당 서버에 접속 정보가 전달될 수 있습니다. 글꼴은 이 사이트 서버에서 제공합니다. 테마 선택은 브라우저 로컬 저장소에 저장됩니다.

문의

이메일로 보낸 내용은 문의에 답변하는 데 사용됩니다. 문의: rlatkdgns042@naver.com

· © 2026 Sanghun Kim