본문 바로가기

개발/Algorithm

[리트코드] Happy Number(python)

리트코드, Happy Number_해피 넘버

 

TL;DR

  • 구현(Implementation)

문제 분석

1. 주어진 숫자 n이 해피 넘버인지 아닌지 판별하는 알고리즘을 작성하라.
2. 해피 넘버는 아래와 같은 과정을 거쳐 얻게 된다.
    2-1. 주어진 숫자의 각 자리수를 제곱하여 더한다.
    2-2. 2-1 과정을 1이 될때까지 반복하거나, 1을 포함하고 있지 않는 주기로 반복된다.
3. 해피 넘버라면 True를, 아니라면 False를 반환한다.

 

- 1, 3 : 해결해야 하는 문제에 대해서 말하고 있다.

- 2 : 알고리즘 구현에 필요한 해피 넘버에 대해서 설명하고 있다.

입출력 형태

입출력 예시

 

- 주어진 숫자 n에 대해서 각 자리수를 제곱하여 더한 숫자를 만든다.

- 만들어진 숫자에 대해서 1이 나올 때까지 반복한다.

풀이

class Solution:
    def isHappy(self, n: int) -> bool:
        # 예외처리
        if n == 1 or n == 7:
            return True
        if n < 10:
            return False
        
        happy = 0
        while True:
            for s in str(n): # 1
                happy += int(s) ** 2
                
            if happy == 1 or happy == 7: # 2
                return True
            
            if happy < 10: # 3
                return False
            
            n, happy = happy, 0
            

 

- 1 : 각 자리수의 제곱을 더하여 happy인지 판별할 숫자를 만드는 것이다. 주어진 입력을 문자열로 만들어 각 자리수에 접근한 후, 다시 숫자로 변환하며 제곱하여 더한다.

- 2, 3 : happy 넘버가 되기 위한 조건이다. 문제 조건 2번에서 해피 넘버를 위한 과정을 반복하면 1이 나오면서 종료되거나, 일정한 패턴이 반복된다고 하였기 때문에 이를 확인해봐야 한다.

    - 직관적으로, 1과 10이 해피 넘버이기 때문에, 종료되는 조건은 2 ~ 9를 살펴보면 될 것 같다.

    - 2의 경우 해피 넘버 과정을 살펴보면 
    - 2 -> 4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 ->  4 -> ... 가 된다.
    - 4 ~ 20까지 패턴이 반복되게 된다. 이 말은 즉, 이 패턴에 등장하는 숫자들은 해피 넘버가 아니라는 것이다.

    - 이 과정을 9까지 진행하게 되면 1과 7을 제외한 10 미만의 숫자들은 해피 넘버가 아님을 알 수 있다.

    - 따라서 해피 넘버가 1 또는 7일 때 참을 반환하고, 그 외의 값일 때는 거짓을 반환한다.

- 다음 과정을 위해 happy를 n으로 설정하고, happy를 0으로 초기화해야 한다.

반응형