n 숫자가 행복한지 판단하는 알고리즘을 작성하세요.
행복한 숫자는 다음 과정을 통해 정의되는 숫자입니다.
임의의 양의 정수에서 시작하여 해당 숫자를 해당 숫자의 제곱의 합으로 바꿉니다.
숫자가 1이 될 때까지(숫자가 1이 되면 그 숫자는 그대로 유지됩니다) 이 과정을 반복하거나, 1을 포함하지 않는 순환에서 끝없이 반복합니다 .
이 과정이 1로 끝나는 숫자는 행복한 숫자입니다.
행복한 숫자이면 true 반환하고 , 그렇지 않으면 false를 반환합니다.
예시 1
Input
n = 19
Output
true
설명
예시 2
Input
n = 2
Output
false
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)
숫자 n의 각 자리수를 리스트에 저장해준다.
ex) n = 19 ▶️ n_list = [1,9]
n_list = list(map(int,str(n)))
n_list
에 담긴 각 숫자들의 제곱합을 담을 변수인 result
를 초기화해준다.
result_list
는 result
값들을 담을 리스트(이후 과정에서 result값을 담을 리스트가 왜 필요한지 설명예정)
우선 처음으로 제시된 n의 각 자리수를 저장해준 리스트(n_list
)를 이용하여 각 자리의 제곱합(result
) 구한다.
for i in n_list:
result += i**2
그 결과가 1이면 true를 반환한다.
그 결과가 1이 아니면 n_list
를 초기화하고 3번 과정에서 새로 계산된 result
값을 담아준다.
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
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
나는 이 순환에 대해 생각을 하지 못했고 결국 무한루프를 감지하는 조건문을 생각해내지 못했다..🥲
내용이 참 알차네용..! ㅎㅎ 잘 보고 갑니다~.. ^^