오늘은 알고리즘의 기초를 다지며 '행복한 숫자(Happy Number)' 문제를 풀어볼 거에요. 준비되셨나요? 시작해봅시다! 🧑💻
문제 설명: 행복한 숫자란 무엇일까요? 🤔
'행복한 숫자' 문제는 이렇게 시작해요. 어떤 양의 정수에서 시작해서, 그 숫자의 각 자릿수를 제곱한 후 합한 새로운 숫자로 바꿉니다. 이 과정을 반복했을 때, 결과가 1이 되면 그 숫자는 '행복한 숫자'라고 해요. 반면 1이 되지 않고 계속 반복되면 '행복하지 않은 숫자'죠. 😄 ↔️ 😔
문제 풀어보기: 실제 코드로 만나는 행복한 숫자 🧑💻
이 코드는 숫자를 문자열로 변환하여 각 자리수를 분리한 후, 각 자리수를 제곱하고 그 합을 다시 계산하는 함수 get_next를 사용합니다. 그리고 중복을 체크하기 위해 seen이라는 집합을 사용하여 이미 계산한 숫자를 저장합니다. 숫자가 1이 될 때까지 또는 숫자가 무한 반복되는 순환에 빠질 때까지 계속 숫자를 변환합니다. 만약 숫자가 1이 되면 True를, 무한 순환에 빠지면 False를 반환합니다.
def is_happy(n):
def get_next(number):
return sum(int(x) ** 2 for x in str(number))
seen = set()
while n != 1 and n not in seen:
seen.add(n)
n = get_next(n)
return n == 1
# 예제 사용
print(is_happy(19)) # True를 출력해야 합니다.
print(is_happy(2)) # False를 출력해야 합니다.
알아야 할 개념: 숫자의 자릿수를 다루는 방법 🔢
- 자리수의 분리와 제곱: 주어진 숫자 n의 각 자리수를 분리하고, 각각을 제곱한 후 이들을 합해야 합니다. 이를 위해 숫자를 문자열로 변환하고, 각 문자를 정수로 변환한 뒤 제곱하면 됩니다.
- 루프 탐지: '행복한 숫자'를 찾는 과정에서 무한 루프에 빠질 위험이 있습니다. 루프를 탐지하기 위해 이전에 계산한 모든 숫자를 저장하고, 새로운 숫자가 이전에 나왔던 숫자와 같은지 확인해야 합니다.
- 집합 사용: 무한 루프를 탐지하려면 이전에 나온 숫자들을 저장해야 하는데, 이를 효율적으로 관리하기 위해 파이썬의 set을 사용할 수 있습니다. set은 원소의 중복을 허용하지 않기 때문에, 이미 계산된 숫자를 빠르게 확인할 수 있습니다.
- 재귀 대 반복: 이 문제는 재귀적으로도 해결할 수 있지만, 여기서는 반복문을 사용하여 해결합니다. 재귀를 사용하면 호출 스택이 너무 깊어져서 스택 오버플로우가 발생할 수 있습니다.
- 종료 조건: 숫자가 1이 되면, 해당 숫자는 '행복한 숫자'이므로 True를 반환하고 함수를 종료합니다. 만약 숫자가 이전에 나왔던 숫자로 되돌아가면 무한 루프에 빠진 것이므로 False를 반환합니다.
행복한 숫자 문제를 해결하기 위해 우리는 숫자의 각 자리수를 제곱하여 더하는 과정을 반복합니다. 이 과정에서 숫자가 1에 도달하면 그 숫자는 행복하다고 할 수 있으며, 무한 루프에 빠지면 행복하지 않은 숫자입니다. 우리는 이 과정을 통해 숫자의 성격을 파악할 수 있으며, 루프를 탐지하기 위해 집합을 사용하여 이미 계산된 숫자들을 추적합니다. 이 문제를 해결함으로써 우리는 숫자의 내부 구조와 재귀적 사고를 이해하는 데 도움이 될 뿐만 아니라, 루프 탐지와 같은 중요한 알고리즘 기술도 배울 수 있습니다. 결론적으로, 행복한 숫자 문제는 프로그래밍 능력을 향상시키는 좋은 연습이 될 수 있습니다.
'프로그래밍 언어(Programming Languages) > LeetCode' 카테고리의 다른 글
[코딩인터뷰] LeetCode - 128. Longest Consecutive Sequence 해시테이블 사용법 (75) | 2024.01.13 |
---|---|
[코딩 알고리즘] LeetCode - 219. Contains Duplicate II 해시테이블 마스터하기 (76) | 2024.01.09 |
[코딩 인터뷰] LeetCode - 242. Valid Anagram 파이썬 카운터 사용법 (76) | 2024.01.07 |
[코딩 알고리즘] LeetCode - 205. Isomorphic Strings 문제로 알고리즘의 세계로! ✨🌟 (72) | 2024.01.04 |
[코딩 인터뷰] LeetCode - 383. Ransom Note 파이썬 해시 테이블과 카운터 사용법 (69) | 2024.01.03 |