프로그래머스 Level2 시소 짝꿍 (Java)

한승현·2023년 1월 25일
0

programmers

목록 보기
16/22
  • https://school.programmers.co.kr/learn/courses/30/lessons/152996
  • 문제
    • 시소는 중심으로부터 2,3,4m씩 떨어진 지점에 좌석이 있다.
    • 탑승한 두 사람의 몸무게 * 떨어진 거리가 같다면 두 사람을 시소 짝꿍이라고 한다.
    • weight가 주어질 때 시소 짝꿍의 수를 구하시오
  • 제한사항
    • 2 ≤ weights의 길이 ≤ 100,000
    • 100 ≤ weights[i] ≤ 1,000
      • 몸무게 단위는 N(뉴턴)으로 주어집니다.
      • 몸무게는 모두 정수입니다.
  • 코드
import java.util.*;

public class Solution {
	public long solution(int[] weights) {
		long answer = 0;
		HashMap<Integer,Long> map = new HashMap<>();
		Set<Integer> mySet = new HashSet<>();
		for(int i = 0; i < weights.length; i++) {
			if(map.containsKey(weights[i])) {
				map.put(weights[i], map.get(weights[i])+1);
			}else {
				map.put(weights[i],1L);
			}
			mySet.add(weights[i]);
		}
		for(int weight : mySet) {
			long weightSize = map.get(weight);
			int w = weight*2;
			if(w%3 == 0 && map.containsKey(w/3)) {
				answer += map.get(w/3)*weightSize;
			}
			if(w%4 == 0 && map.containsKey(w/4)) {
				answer += map.get(w/4)*weightSize;
			}
			
			w = weight*3;
			if(w%2 == 0 && map.containsKey(w/2)) {
				answer += map.get(w/2)*weightSize;
			}
			if(w%4 == 0 && map.containsKey(w/4)) {
				answer += map.get(w/4)*weightSize;
			}
			
			w = weight*4;
			if(w%3 == 0 && map.containsKey(w/3)) {
				answer += map.get(w/3)*weightSize;
			}
			if(w%2 == 0 && map.containsKey(w/2)) {
				answer += map.get(w/2)*weightSize;
			}
			
			if(weightSize > 1) {
				answer += weightSize*(weightSize-1)/2;
			}
			map.remove(weight);
		}
		return answer;
	}
}
  • 풀이
    • 처음 제한사항을 보고 든 생각은 제한사항이 10만으로 반복문 한번에 해결해야 한다는 것이었다. 하지만 모든 몸무게의 조합을 구해야 한다는 것을 생각한다면 weights의 범위는 100~1000까지 많아야 900개로, map으로 counting을 해주면 된다는 것을 알 수 있다.
    • 주의해야 할 점은 각 개수를 더할 때, 각 몸무게가 같은 경우와 아닌 경우를 다르게 계산해야 한다.
      • 몸무게가 같은 경우 중복일 경우도 생각해서 N*(N-1)/2를 더해주어야 한다.
      • 다른 경우 그냥 A의 개수*B의 개수를 해주면 된다.
profile
사람을 만족시켜줄 수 있는 개발자

0개의 댓글