리트코드, 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으로 초기화해야 한다.
반응형
'개발 > Algorithm' 카테고리의 다른 글
[프로그래머스] 최대값과 최소값(python) (0) | 2021.06.12 |
---|---|
[리트코드] Add Two Numbers(python) (0) | 2021.06.11 |
[리트코드] Reverse Linked List(python) (0) | 2021.06.10 |
[리트코드] Merge Two Sorted Lists(python) (0) | 2021.06.10 |
[리트코드] Merge Sorted Array(python) (0) | 2021.06.10 |