문제
어느 공원 놀이터에는 시소가 하나 설치되어 있습니다. 이 시소는 중심으로부터 2(m), 3(m), 4(m) 거리의 지점에 좌석이 하나씩 있습니다.
이 시소를 두 명이 마주 보고 탄다고 할 때, 시소가 평형인 상태에서 각각에 의해 시소에 걸리는 토크의 크기가 서로 상쇄되어 완전한 균형을 이룰 수 있다면 그 두 사람을 시소 짝꿍이라고 합니다. 즉, 탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있습니다.
사람들의 몸무게 목록 weights이 주어질 때, 시소 짝꿍이 몇 쌍 존재하는지 구하여 return 하도록 solution 함수를 완성해 주세요.
접근
깨달은 게, 시소가 2,3,4m만큼 떨어져 있는데 1m도 있는 줄 알았습니다.
100,100 때문에 헷갈린 듯합니다.
그걸 알고 나니 경우의 수라는 말이 이해가 되었습니다.
시소가 2,3,4 만큼 떨어질 수 있으므로
경우의 수는
2m 떨어진 경우 vs 2m 떨어진 경우
2m 떨어진 경우 vs 3m 떨어진 경우
2m 떨어진 경우 vs 4m 떨어진 경우
3m 떨어진 경우 vs 4m 떨어진 경우
이렇게 4가지 밖에 안 나옵니다.
이제 배열을 오름차순 정렬해서 *1, *2/3, *2/4, *3/4가 map에 있을 때마다 연산을 해주면 됩니다.
오름차순 정렬을 한 이유는 맵에 순차적으로 값을 넣기 때문입니다.
예를 들면 [1,2,1]라는 배열이 있을 때
첫 번째는 map에 아무 값도 없으므로 map에 1만 넣고 끝입니다.
두 번째는 map에 1이 있고, 2와 경우의 수를 계산한 값은 [2, 4/3, 1, 3/2]인데, 1이 있으므로 answer+=1 해줌.
세 번째는 map에 1,2가 있고 1의 경우의 수를 계산한 값은 [1, 2/3, 2/4, 3/4], 1이 있으므로 answer+=1 해줌
그러나 답은 3 입니다. 2와 경우의 수를 계산했을 때 1이 2개 있어야 되는데 정렬을 안 하면 하나밖에 못 찾기 때문입니다.
오름차순 정렬해 준 [1,1,2]이어야만 2와 경우의 수를 계산할 때 1이 2개 있는 걸 알고 answer+=2를 해줘서 3을 만들 수 있습니다.
코드
function solution(weights) {
let answer = 0;
const map = new Map();
const cals = [1,2/3,2/4,3/4];
weights.sort((a,b)=> a - b).forEach(value=>{
cals.forEach(cal =>{
if(map.has(value*cal)){
answer += map.get(value*cal);
}
})
map.set(value,(map.get(value) || 0)+1);
})
return answer;
}
주의
시소는 2,3,4 미터만큼 떨어져 있음
'공부 정리 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 연속 펄스 부분 수열 (0) | 2023.03.06 |
---|---|
[프로그래머스] 혼자서 하는 틱택토 JAVA (0) | 2023.02.24 |
[프로그래머스] 숫자 변환하기 js (0) | 2023.02.13 |
[프로그래머스] n진수 게임 js (0) | 2023.02.04 |
[프로그래머스] 표현 가능한 이진트리 js java (0) | 2023.01.31 |
댓글