기본적이고 필수적인 자연수의 자릿수 구하기 문제를 위한 3가지 방법
Summary
- Pythonic Way: str형으로 변환 후 len() 내장함수 활용
- Mathematical Way: log10 함수 활용
- Algorithmic Way: 반복문 활용해 자릿수 누적
Problem Definition
어떤 자연수 N이 D-digit Number일 때, D를 구하라
(어떤 자연수 N의 자릿수를 구하라)
단, N ≥ 0이며 N이 0인 경우는 0을 출력한다.
Solutions
1. Pythonic Way - len(str( ))
가장 손쉽고 유용한 방법으로, int를 str으로 변환하여 내장함수 len을 활용해 길이를 구한다.
이때, 0의 경우만 예외처리를 해주어야 함에 주의하자.
def size(n):
if n:
return len(str(n))
else: # n == 0
return 0
print(size(10))
print(size(123))
print(size(4885))
print(size(1))
print(size(0))
-------------------------------------------
# Results
2
3
4
1
0
숫자를 str으로 바꾸어 다루면, 자릿수별로 대응하기가 용이하다 (자릿수의 합 등)
2. Mathematical Way - log10( )
고등학교 수학의 log를 활용하는 방법으로, 과학 및 공학에서 주로 사용되는 e 표기법(더보기 참조)과도 연관이 있다.
e 표기법 (Exponential notation)
숫자를 a × 10n (0 ≤ a < 10) 꼴로 표현하는 방식으로, 매우 큰 숫자나 작은 숫자를 표현하기에 용이하다.
- 36599 = 3.6599 × 104 = 3.6599e4
- 0.1234 = 1.234 × 10-1 = 1.234e-1
- 0.0032 = 3.2 × 10-3 = 3.2e-3
log10( ) 함수는 밑이 10인 로그를 취하는 함수로,
로그 값의 정수 부분을 활용해 e 표기법의 n 부분(10n의 n)을 손쉽게 확인할 수 있다.
자릿수에서 실질적으로 필요한 값은 log의 정수 부분이므로, 실수 부분을 버림(더보기 참조) 처리하기 위해 int( )함수를 활용한다.
버림(int, math.trunc) vs 내림(math.floor)
공통점
소수 부분을 제거하고 정수 부분만 남기기 위함
차이점 - 양수에서는 동일하게 동작하지만, 음수에서 차이가 발생
버림: 단순히 숫자의 정수 부분만을 남기고 소수 부분을 없애버림
내림: 해당 숫자보다 크지 않은(작거나 같은) 정수값으로 변환
예시
int() | math.trunc() | math.floor() | |
3.14 | 3 | 3 | 3 |
0 | 0 | 0 | 0 |
-3.14 | -3 | -3 | -4 |
관련 포스팅
추후 업로드 예정
자릿수는 n+1과 같이 표현할 수 있으며, 로그의 정의에 의해 진수 부분은 0이 될 수 없으므로 예외 처리를 진행한다.
import math as m
def log_size(n):
if n:
return int(m.log10(n)) + 1
else: # n == 0
return 0
print(log_size(5))
print(log_size(1234))
print(log_size(3045758))
print(log_size(0))
-------------------------------------------
# Results
1
4
7
0
3. Algorithmic Way - Iteration
10으로 나누었을 때 몫을 활용하는 방법으로, 반복문을 통해 몫이 0이 되는 순간까지 자릿수를 증가시킨다.
def iter_size(n):
cnt = 0
while n:
n //= 10
cnt += 1
return cnt
print(iter_size(1))
print(iter_size(11))
print(iter_size(123456))
print(iter_size(0))
-------------------------------------------
# Results
1
2
6
0
Reference
2와 3의 방법만 생각하고 있었는데, 1의 방법을 깨닫게 해준 블로그
Epilogue
파이썬에 한해서는 str을 이용한 방법이 가장 편하고 좋아보이지만,
타 언어에서는 사용할 수 없는 방법인만큼 2, 3번의 알고리즘도 충분히 익혀두자.
댓글