202. Happy Number
2026-03-19
리트코드 202번 풀이
문제
풀이
아이디어
무한루프가 발생한다는 것은 같은 숫자가 반복적으로 등장한다는 것, 즉 사이클이 발생한다는 것이다. 그래서 Floyd의 사이클 감지 알고리즘(토끼와 거북이)을 활용했다. (참고: 141. Linked List Cycle)
getNext(n): 각 자릿수의 제곱합을 구하는 함수slow: 한 번씩 변환fast: 두 번씩 변환
사이클이 있으면 fast === slow가 되고, 행복한 숫자라면 fast가 1에 도달한다.
코드
function isHappy(n: number): boolean {
function getNext(n: number) {
let next = 0;
while (n !== 0) {
next += (n % 10) ** 2;
n = Math.floor(n / 10);
}
return next;
}
let fast = n;
let slow = n;
while (fast !== 1) {
slow = getNext(slow);
fast = getNext(getNext(fast));
if (fast === 1 || slow === 1) return true;
if (fast === slow) return false;
}
return true;
}시간 / 공간 복잡도
- 시간 복잡도: O(log n) — 각 변환 단계에서 자릿수만큼 연산, 사이클은 상수 범위 내에서 발생
- 공간 복잡도: O(1) — 포인터 두 개만 사용