Write an algorithm to determine if a number n
is happy.
Return true
if n
is a happy number, and false
if not.
n
n
이라는 숫자가 Happy 한가?n
)에서 시작해서 각 자릿수의 제곱을 하여 모두 더하여 다음 수를 구한다.1
이 들어있으면 n
을 happy하다고 하고, 그렇지 않으면 happy하지 않다고 한다.다음 숫자 구하는 방법 (각 자릿 수를 따로 구하는 방법)
Math.log10()
을 이용하여 총 자릿 수를 구하고 이를 로 나누고 10 모듈러 연산 사용 (이후 각 자릿수 제곱 후 더함)순환 고리를 찾아내는 방법 (자료구조 Set
이용)
Set
에 넣음Set
안에 있는지 확인한다.Complexity
class Solution {
private static final int HAPPY_TARGET = 1;
public boolean isHappy(int n) {
Set<Integer> repository = new HashSet<>();
int currentNumber = n;
while (!repository.contains(currentNumber)) {
repository.add(currentNumber);
currentNumber = getNextNumber(currentNumber);
}
return repository.contains(HAPPY_TARGET);
}
private int getNextNumber(int number) {
char[] numberLetters = String.valueOf(number).toCharArray();
int sum = 0;
for (char letter : numberLetters) {
int value = letter - '0';
sum += value * value;
}
return sum;
}
}
Math.log10()
을 이용하여 총 자릿 수를 구하고 이를 로 나누고 10 모듈러 연산 사용class Solution {
private static final int HAPPY_TARGET = 1;
public boolean isHappy(int n) {
Set<Integer> repository = new HashSet<>();
int currentNumber = n;
while (!repository.contains(currentNumber)) {
repository.add(currentNumber);
currentNumber = getNextNumber(currentNumber);
}
return repository.contains(HAPPY_TARGET);
}
private int getNextNumber(int number) {
int size = (int) Math.log10(number) + 1;
int sum = 0;
for (int i = 0; i < size; i++) {
int letter = number / (int) Math.pow(10, i) % 10;
sum += letter * letter;
}
return sum;
}
}
성능 비교
String
, char[]
등의 중간 객체를 필요로 하기 때문에 해당 객체를 생성하는데 시간과 메모리가 꽤 소요됨가독성 비교