본문 바로가기

Algorithm

[leetcode 75] 202. Happy Number

 

문제해석

숫자 n이 happy인지 판단하기

happy number는 다음과 같이 정의한다

양의 정수로 시작해 각자릿수의 제곱을 더한다.

위 과정을 반복해 1이 나오면 종료하거나 아니면 무한히 반복한다.

과정의 마지막이 1이면 happy number

 

정답 예)

public boolean isHappy(int n) {
    // 각자릿수의 제곱의 값이 반복되어 나오는지 체크하기 위한 자료구조
    // add와 contains를 사용하므로 O(1)의 비용이 드는 HashSet 사용
    Set<Integer> set = new HashSet<>();
    while (n != 1) {
        int digit;
        int num = n;
        n = 0;
        while (num != 0) {
            // 각 자릿수 계산
            digit = num % 10;

            // 자릿수 마다 제곱해 더한다
            n += digit * digit;
            num = num / 10;
        }

        // 모든 자릿수를 제곱해 더한 값이 이미 기존에 처리한 이력이 있는지 체크
        // 반복된다면 false;
        if (set.contains(n)) {
            return false;
        }
        set.add(n);
    }
    return true;
}

 

다른 답들을 찾아보니 n이 7이 되는 경우에는 결국 1이 된다는 사실을 이용한 풀이도 있었다.

public boolean isHappy(int n) {
    while (n > 10) {
        int digit;
        int num = n;
        n = 0;
        while (num != 0) {
            // 각 자릿수 계산
            digit = num % 10;

            // 자릿수 마다 제곱해 더한다
            n += digit * digit;

            num = num / 10;
        }
    }

	// n이 7인 경우에도 최종 결과는 1에 도달
    return (n == 1 || n == 7) ? true : false;
}