백준 1312번: 소수

KimRiun·2021년 4월 18일
0

알고리즘_문제

목록 보기
2/26

사용 언어: python 3.7.4

❓ Problem

문제 설명

문제

피제수(분자) A와 제수(분모) B가 있다. 두 수를 나누었을 때, 소숫점 아래 N번째 자리수를 구하려고 한다. 예를 들어, A=3, B=4, N=1이라면, A÷B=0.75 이므로 출력 값은 7이 된다.

입력

첫 번째 줄에 A와 B(1≤A, B≤100,000), N(1≤N≤1,000,000)이 공백을 경계로 주어진다.

출력

A÷B를 했을 때, 소숫점 아래 N번째 수를 출력한다.


백준 1312번: 소수

🚩 Solution

1. 접근법

TRY 1

처음에 짠 코드는 런타임 에러가 발생했다.

A를 B를 나눈 수에 10^n을 곱하면, 그 수의 일의 자릿수가 원하는 답이라는 식으로 접근했다.

하지만 n값이 커지자 오버플로우가 났다.

# 런타임 에러
a, b, n = map(float, input().split())

num = a/b

num = num*(10**n)

num = int(num%10)

print(num)

TRY 2

큰 수를 저장할 수 있는 타입을 찾다가 다른 블로그의 해답에 눈길이 끌려 봐버렸다.

직접 소수점을 계산하듯이 그림으로 그려보니 간단했다.

예를 들어, A가 25, B가 7, N을 3이라고 하자.

나머지에 10을 곱하고 다시 나머지에 10을 곱하는 과정을 거친 후, 3번째 나머지에 10을 곱한 값에 7을 나눈 몫이 구하고자 하는 소수점 값이다.

즉, A를 B로 나눈 나머지에 10을 곱하는 과정을 N-1번 거친 후, N번째 나머지에 10을 곱한 값에 B를 나눈 몫이 구하고자 하는 소수점 값이다.

2. 코드

a, b, n = map(int, input().split())

r = a%b 

for i in range(n-1):
    r = (r*10)%b
    
print((r*10)//b)

3. 결과

채점 결과

correct

메모리시간코드길이
28776 KB196 ms106 B

시간 복잡도 분석

O(logN)

📕 피드백

1. 검색한 내용

  1. 여러 개의 수를 공백으로 나눠 입력받기: map(int, input().split())
  2. 파이썬의 숫자 타입 4가지: int, long, float, complex (※ double은 없다)

2. 실수

x

3. 발전 방향

오버플로우가 나면 타입 바꾸기 외에도 아예 접근 방식을 바꾸는 방법도 필요함을 느꼈다.

사람이 작은 수를 차례대로 처리하는 방법처럼 접근하는 법을 생각해봐야겠다.

4. 느낀점

수학적 사고를 그대로 코드로 옮기니까 좀 재밌다.

profile
Java, Python

0개의 댓글