✔ 시소 짝꿍
문제 분석하기
각각의 짝에 대해 평행 상태가 될 수 있는 경우의 수를 모두 구하도록 함
손으로 풀어보기
- 몸무게 목록을 오름차순 정렬
- 각각의 짝에 대해 평행 상태가 될 수 있다면 시소 짝꿍의 쌍을 증가
- 시소 짝꿍1과 시소 짝꿍2의 무게가 동일할 때
- 시소 짝꿍1 * 2와 시소 짝꿍2의 무게가 동일할 때
- 시소 짝꿍1 * 3과 시소 짝꿍2 * 2의 무게가 동일할 때
- 시소 짝꿍1 * 4와 시소 짝꿍2 * 3의 무게가 동일할 때
- 시소 짝꿍의 쌍 반환
슈도코드 작성하기
weights(사람들의 몸무게 목록)
answer(시소 짝꿍 쌍의 개수)
weights 오름차순 정렬
map(몸무게와 갯수를 담을 HashMap)
for(w -> weights만큼) {
couple1(w의 짝 조건 1) = (w * 1.0)
couple2(w의 짝 조건 2) = (w * 1.0) / 2.0
couple3(w의 짝 조건 3) = (w * 2.0) / 3.0
couple4(w의 짝 조건 4) = (w * 3.0) / 4.0
if(map에 couple1, 2, 3, 4가 존재한다면)
answer을 map.get만큼 증가
map에 w 저장
}
answer 반환
코드 구현하기
/**
* 152996) 시소_짝꿍
*/
public class L093_152996 {
// weights(사람들의 몸무게 목록)
public long solution(int[] weights) {
// answer(시소 짝꿍 쌍의 개수)
long answer = 0;
// weights 오름차순 정렬
Arrays.sort(weights);
// map(몸무게와 갯수를 담을 HashMap)
Map<Double, Integer> map = new HashMap<>();
for (int weight : weights) {
// 시소 짝꿍1과 시소 짝꿍2의 무게가 동일할 때
double couple1 = (weight * 1.0);
// 시소 짝꿍1 * 2와 시소 짝꿍2의 무게가 동일할 때
double couple2 = (weight * 1.0) / 2.0;
// 시소 짝꿍1 * 3과 시소 짝꿍2 * 2의 무게가 동일할 때
double couple3 = (weight * 2.0) / 3.0;
// 시소 짝꿍1 * 4와 시소 짝꿍2 * 3의 무게가 동일할 때
double couple4 = (weight * 3.0) / 4.0;
// map에 couple1, 2, 3, 4가 존재한다면 answer을 map.get만큼 증가
if (map.containsKey(couple1))
answer += map.get(couple1);
if (map.containsKey(couple2))
answer += map.get(couple2);
if (map.containsKey(couple3))
answer += map.get(couple3);
if (map.containsKey(couple4))
answer += map.get(couple4);
// map에 weight 저장
map.put((weight * 1.0), map.getOrDefault((weight * 1.0), 0) + 1);
}
// answer 반환
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
L093_152996 solution = new L093_152996();
int[] weights = { 100, 180, 360, 100, 270 };
long result = solution.solution(weights);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[154539] 뒤에 있는 큰 수 찾기 (0) | 2024.02.12 |
---|---|
[154538] 숫자 변환하기 (0) | 2024.02.11 |
[150369] 택배 배달과 수거하기 (0) | 2024.02.10 |
[150368] 이모티콘 할인행사 (0) | 2024.02.09 |
[148653] 마법의 엘리베이터 (0) | 2024.02.09 |