코딩테스트 연습
프로그래머스 코딩테스트 연습 - 시소 짝꿍 JavaScript
citron031
2023. 6. 18. 16:07
처음에 작성한 코드는 다음과 같았다.
function solution(weights) {
let answer = 0;
// 2 3 4 미리 구하기
const weightsObj = {};
weights.forEach(el => {
if(!weightsObj[el]) {
weightsObj[el] = [2, 3, 4].map(item => item * el);
}
})
for(let i = 0; i < weights.length - 1; i++) {
const now = weightsObj[weights[i]];
for(let j = i + 1; j < weights.length; j++) {
const weight = weights[j];
let checker = false;
weightsObj[weight].forEach(v => {
if(now.includes(v) && !checker) {
checker = true;
}
});
if(checker) {
answer++;
}
}
}
return answer;
}
시간초과로 문제 해결에 실패하여 다른 방법에 대해서 생각하였다.
쉽사리 문제 해결 방법에 대해서 생각해내지 못했는데 캐싱을 사용해서 중복 계산을 줄여야 한다는 점과 경우의 수가 제한되어 있다는 등 검색을 통해서 힌트를 많이 보았다.
결국, 내 스스로 푼 문제는 아니었으므로 더 공부하고 이해할 수 있도록 해야겠다.
function solution(weights) {
let answer = 0;
const distance = [1, 3 / 2, 2, 4 / 3]; // 경우의 수
const memo = {};
weights.sort((a,b)=> b - a).forEach(weight => {
for(let i of distance) {
const now = weight * i;
if(memo[now]) {
answer += memo[now];
}
}
if(memo[weight]) {
memo[weight]++;
}else {
memo[weight] = 1;
}
})
return answer;
}