본문 바로가기
CS/문제해결전략

자연수의 자릿수 구하기

by 낭만파 2021. 6. 6.
반응형
기본적이고 필수적인 자연수의 자릿수 구하기 문제를 위한 3가지 방법

 

Summary


  1. Pythonic Way: str형으로 변환 후 len() 내장함수 활용
  2. Mathematical Way: log10 함수 활용
  3. 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번의 알고리즘도 충분히 익혀두자.

 

 

 

반응형

댓글