문제
주어진 number는 각 자릿수의 제곱을 더한 값으로 할당되는데 number가 1이 되면 happy number
끝나지않는 반복에 빠지면 happy number가 아니다.
풀이
happy number를 구하는 건 쉽지만 happy number가 아닌 수를 구하는 건 끝나지않는 반복에 빠져있는지에 대한 별도의 체크가 필요하다.
이 체크는 어떻게 해도 상관없지만 나는 map을 이용해서 구현했다.
'2^31 - 1 크기의 boolean 배열'로 선언해서 이미 number였던 값이었는지를 체크해도 되는데, 반복되는 수만 체크해도 되기 때문에 불필요하게 배열 사이즈를 키울 필요는 없다고 판단했다. 하지만 배열을 쓰기에는 해당 number가 happy number인지 판단하는 과정에서 얼마나 많은 연산을 할 지는 알 수 없기 때문에 사이즈를 판단할 필요가 없는 map을 사용했다.
코드
class Solution {
public boolean isHappy(int n) {
Map<Integer, Boolean> isDuplicate = new HashMap<>();
int temp = 0;
while(n != 1) {
if (isDuplicate.getOrDefault(n, false)) {
return false;
}
isDuplicate.put(n, true);
temp = 0;
while(n != 0) {
int a = n % 10;
temp += a*a;
n /= 10;
}
n = temp;
}
return true;
}
}
'코딩테스트' 카테고리의 다른 글
[leetcode] 168. Excel Sheet Column Title (0) | 2025.03.01 |
---|---|
[leetcode] 11. Container With Most Water (0) | 2025.01.15 |
4. Median of Two Sorted Arrays (0) | 2024.09.01 |
[leetcode] 1657. Determine if Two Strings Are Close (0) | 2024.08.24 |
[leetcode] 80. Remove Duplicates from Sorted Array II (0) | 2024.08.03 |