1 이상의 정수 n이 happy number라면 true 아니면 false 반환
n의 각 자리 숫자를 제곱하여 더하는 과정을 반복했을 때
1이 되는 순간이 있다면 happy한 숫자고
영원히 반복하게 된다면 happy하지 않음
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
let set = new Set();
while (set.has(n) === false) {
let sum = 0;
let str = n.toString();
for (let i = 0; i < str.length; i++)
sum += Math.pow(parseInt(str[i]), 2);
if (sum === 1)
return true;
set.add(n);
n = sum;
}
return false;
};
값만 저장하면 되므로 set을 사용
n을 문자로 바꾼 뒤 각 자리 수를 제곱하여 합산
그 결과가 1이면 true 반환 아니라면 set에 넣음
합산 결과를 가지고 다시 반복하는데, 그 결과가 이미 set에 들어있었다는 것은
이대로 다시 반복해도 똑같이 돌아간다는 의미와 같음
(같은 숫자로 같은 방식 계산을 돌리기 때문에)
따라서 set에 존재한다면 반복 멈추고 false 반환
Accepted
Runtime 54ms (Beats 77.15%)
Memory 49.19MB (Beats 91.12%)
이번에는 알고리즘 구현하는 것보다 접근 방식을 어떻게 하느냐가 더 어려웠던 것 같다. 계산 결과 1이 되면 true인 건 알겠는데, 계속 반복하면서 false인 건 어떻게 알아차리지?라는 생각을 한참 했던 것 같다. 이것 저것 읽어본 결과 이미 같은 계산값이 존재하면 똑같은 숫자로 계산해봤자 똑같은 결과가 나오는 반복이 된다는 것을 알고 위와 같이 구현했다. 처음에는 set에 string 값을 저장했는데 그러려면 toString()을 두번 사용해야 되기 때문에 계산하기 전에만 string으로 변환했다. 근데 저렇게 하면 매개변수 값을 바꾸는 게 돼서 실제로 적용할 때는 따로 변수를 만드는 것이 좋을 것 같다.