https://school.programmers.co.kr/learn/courses/30/lessons/152996
문제 분류 : 코딩테스트 연습 > 연습문제 > 시소 짝꿍
난이도 : 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;
}
}
'Algorithm > Programmers Java' 카테고리의 다른 글
Java 프로그래머스 무인도 여행 (0) | 2024.02.28 |
---|---|
Java 프로그래머스 숫자 변환하기 (0) | 2024.02.28 |
Java 프로그래머스 피로도 (0) | 2024.02.28 |
Java 프로그래머스 멀리 뛰기 (0) | 2024.02.28 |
Java 프로그래머스 올바른 괄호 (0) | 2024.02.28 |