LeetCode는 프로그래밍 문제를 풀며 코딩 실력을 향상할 수 있는 온라인 플랫폼입니다. 다양한 알고리즘 및 데이터 구조 문제를 제공하며, 면접 대비에 유용합니다. 해당 문제는, LeetCode Problems에서 볼 수 있는 난이도 '쉬움 (Easy)' 단계인 "Add Digits" 문제입니다.
--> https://leetcode.com/problems/add-digits/description/
문제 :
Given an integer num, repeatedly add all its digits until the result has only one digit, and return it.
Example 1 :
Input : num = 38
Output : 2
Explanation : The process is 38 --> 3 + 8 --> 11 11 --> 1 + 1 --> 2 Since 2 has only one digit, return it.
Example 2 :
Input : num = 0
Output : 0
Constraints :
0 <= num <= 2^31 - 1
Follow up : Could you do it without any loop/recursion in O(1) runtime?
이 문제는 주어진 정수 num의 모든 자릿수를 반복적으로 더하여 결과가 한 자리 숫자가 될 때까지 계산한 후 그 결과를 반환하는 것입니다. 하지만 컨디션이 조금 어려운 게, 반복문, 재귀 없이 풀어보라는 겁니다. 저는 이게 무조건 수학적인 접근이라고만 짐작이 갔지만, 결국 풀지는 못했습니다. 하지만 반복문을 쓰고는 쉽게 풀었습니다. 그 코드라도 공유해 드리겠습니다 :
class Solution {
public int addDigits(int num) {
while (num >= 10) {
int res = 0;
while (num != 0) {
res = res + num % 10;
num /= 10;
}
num = res;
}
return num;
}
}
코드에 설명이 필요 없을 정도로 쉬운 코드입니다. 요약해드리자면 이 코드는 주어진 정수 num의 자릿수를 반복적으로 더하여 한 자리 숫자가 될 때까지 계산하는 알고리즘을 구현한 것입니다. 이 방법은 루프를 사용하여 각 자릿수를 더하고, 그 결과를 다시 반복하는 방식입니다. 끝!
공간복잡도는 조건을 지켰지만, 시간 복잡도가 O(logn) 이라는 점...
이 문제를 조금 더 파헤쳐 보고자 사람들의 솔루션이랑 인터넷을 뒤져봤는데요, 수학적인 접근방식을 찾았습니다 !
class Solution {
public int addDigits(int num) {
if (num == 0) {
return 0;
} else {
return 1 + (num - 1) % 9;
}
}
}
코드를 분석하자면,
- 입력 값이 0인 경우:
- num이 0이면 바로 0을 반환합니다.
- 입력 값이 0이 아닌 경우:
- 1 + (num - 1) % 9 공식을 사용하여 디지털 루트를 계산하고 반환합니다.
저 %9 가 핵심입니다. 분명 수업시간 때 봤던 내용이었는데, 다 까먹고 이렇게 봐서야 떠오르니 제 기억력 때문에 씁쓸합니다.
'LeetCode' 카테고리의 다른 글
[LeetCode] - 706. Design HashMap (0) | 2024.07.29 |
---|---|
[LeetCode] - 225. Implementing Stack Using Queues (0) | 2024.07.29 |
[LeetCode] - 2639. Find the Width of Columns of a Grid (0) | 2024.07.29 |
[LeetCode] - 46. Permutations (0) | 2024.07.28 |
[LeetCode] - 371. Sum of Two Integers (0) | 2024.07.28 |