코딩(Coding)/백준 문제풀이

[백준] 1312번: 소수

J.S.Y 2021. 1. 28. 12:52
728x90

링크: www.acmicpc.net/problem/1312

 

1312번: 소수

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

www.acmicpc.net

소수

문제

피제수(분자) 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번째 수를 출력한다.


문제 접근

해당 문제는 나눗셈의 과정을 논리적으로 해석하는 것을 묻는 문제인것 같다.
예시를 들어 a=3 b=4라고 할때 a를 b로 나누는 과정을 살펴보면, a가 b보다 작기때문에 a에 0을 붙인다.(10을 곱한다.) 이제 a가 b보다 커졌으니 b로 나눈다.눈 몫은 7이고 나머지는 2이다. 나머지를 다시 a라 했을때, a=2, b=4이므로 또 나눈다. a가 b보다 작기때문에 a에 0을 붙인다.(10을 곱한다.) a가 b보다 커졌으니 a를 b로 나눈다. 몫은 4 나머지는 0이다.

즉 3/4 = 0.75인 것이다.

위 과정을 정리해보면

1. a가 b보다 작으면 a에 10을 곱한다.

2. a를 b로 나눈 몫과 나머지를 구한다.

3. 몫은 소수점의 자리가 되고 나머지는 a로 갱신된다.

4. 다시 1번으로 돌아간다.

위 과정을 반복하면 된다.

 

이를 코드로 표현하면 아래와 같다.


코드

"""
백준 알고리즘 1157번: 단어 공부
https://www.acmicpc.net/problem/1157
"""
import sys

def calc(a,b,n):
    li = []
    i = 0
    while i != n+1:
        # a가 b보다 작을때
        if a < b:
            a *= 10
            li.append(0)

        # 몫과 나머지를 구해 a를 갱신한다.
        quot = int(a / b)
        rema = int(a % b)

        li.append(quot)
        a = rema*10
        i += 1
    return li[n]

def main():
    a, b, n = sys.stdin.readline().split()
    a = int(a); b = int(b); n = int(n)
    print(calc(a,b,n))

if __name__ == "__main__":
    main()
728x90