[LeetCode] Easy | Happy Number Python

콩이·2024년 12월 9일
0

코딩테스트 Python

목록 보기
13/13

📍 문제 설명

n 숫자가 행복한지 판단하는 알고리즘을 작성하세요.

행복한 숫자는 다음 과정을 통해 정의되는 숫자입니다.

  • 임의의 양의 정수에서 시작하여 해당 숫자를 해당 숫자의 제곱의 합으로 바꿉니다.

  • 숫자가 1이 될 때까지(숫자가 1이 되면 그 숫자는 그대로 유지됩니다) 이 과정을 반복하거나, 1을 포함하지 않는 순환에서 끝없이 반복합니다 .

  • 이 과정이 1로 끝나는 숫자는 행복한 숫자입니다.

행복한 숫자이면 true 반환하고 , 그렇지 않으면 false를 반환합니다.

📍 예시

  • 예시 1

    • Input

      n = 19

    • Output

      true

    • 설명

      12+92=821^2 + 9^2 = 82

      82+22=688^2 + 2^2 = 68

      62+82=1006^2 + 8^2 = 100

      12+02+02=11^2 + 0^2 + 0^2 = 1

  • 예시 2

    • Input

      n = 2

    • Output

      false

📍 풀이 point

🔓 Try1 🔓

class Solution:
    def isHappy(self, n: int) -> bool:
        n_list = list(map(int,str(n)))
        
        result = 0
        result_list = []

        for i in n_list:
            result += i**2
        
        while result :
            if result == 1:
                return True
            else: 
                n_list = []
                n_list = list(map(int,str(result)))
                result = 0 
                for i in n_list:
                    result += i**2

                if result in set(result_list):
                    return False
                else:
                    result_list.append(result)             
  1. 숫자 n의 각 자리수를 리스트에 저장해준다.
    ex) n = 19 ▶️ n_list = [1,9]

    n_list = list(map(int,str(n)))
  2. n_list에 담긴 각 숫자들의 제곱합을 담을 변수인 result를 초기화해준다.

    result_listresult 값들을 담을 리스트(이후 과정에서 result값을 담을 리스트가 왜 필요한지 설명예정)

  3. 우선 처음으로 제시된 n의 각 자리수를 저장해준 리스트(n_list)를 이용하여 각 자리의 제곱합(result) 구한다.

    for i in n_list:
           result += i**2
  4. 그 결과가 1이면 true를 반환한다.

  5. 그 결과가 1이 아니면 n_list를 초기화하고 3번 과정에서 새로 계산된 result 값을 담아준다.

  1. result값을 n_list에 담았으니 다음 값을 담기 위해 초기화 해주고, n_list에 담긴 값들의 제곱합을 다시 구해 result를 재정의한다.

    else: 
       n_list = []
       n_list = list(map(int,str(result)))
       result = 0 
       for i in n_list:
          result += i**2
             
  2. result가 1이 아니면 else 부분이 무한루프를 돌게 되는데, 이를 감지하고 false를 반환할 조건문을 넣어줘야한다.

    if result in set(result_list):
         return False
    else:
         result_list.append(result)  

    나는 이 부분을 생각하기가 어려워 gpt에게 직접적인 코드말고 설명으로 힌트를 조금 받고 작성하였다..

    1) result 결과물을 result_list에 하나씩 저장해준다.

    2) result 결과물이 result_list에 있을 경우는 무한루프이기 때문에 false를 반환하게 하고, result_list에 없을 경우는 result 결과물을 result_list에 계속 추가해준다.

    이 조건이 가능했던 이유는, result 숫자값이 순환하기 때문이다.

    ex) 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4

    나는 이 순환에 대해 생각을 하지 못했고 결국 무한루프를 감지하는 조건문을 생각해내지 못했다..🥲

1개의 댓글

comment-user-thumbnail
2025년 1월 21일

내용이 참 알차네용..! ㅎㅎ 잘 보고 갑니다~.. ^^

답글 달기