[BOJ] 백준 2860번: 종이에 숫자 쓰기
1일 1PS 17일차!
📚 문제
골드 4
- 3.2 같은 경우는 32가 아니라 16이 곱해서 나오는 최소의 정수이다. 이는 3.2 가 32/10 이면서 16/5 이기 때문이다. 즉 최소의 정수를 구하기 위해서는 소수의 분모를 구하면 되고 이는 2와 5로 소인수분해 될 수 밖에 없다.
- 이때 가장 쉽게 최소의 분모를 구하는 방법은 분자와 분모의 최소공배수를 이용하는 방법이다.
💡 포인트
- 소수를 입력받아 10^n 을 곱해 정수형태를 만들어준다.
- 해당 값과 10^n 의 최소 공배수를 구해 나눠준다.
- 소수가 가장 간단한 형태의 분자와 분모로 나뉜다.
- 이때 분모의 개수의 [1~5] 로 분자의 수를 만들어주는 문제이다.
- m 개의 수를 1 에 넣고 n = n - m 을 한다.
- n < m 가 될 때까지 n = n - m 을 반복하며 칸수를 올린다.
- n < m 이면 마지막으로 n개만 한 칸을 더 올린다.
💻 코드
import math
import sys
n = int(''.join(input().split('.')))
m = 10 ** (len(str(n)) - 1)
r = math.gcd(n, m)
n //= r
m //= r
arr = [0 for _ in range(5)]
arr[0] = m
n -= m
for i in range(1, 5):
if n >= m:
arr[i -1], arr[i] = 0, m
n -= m
else:
arr[i - 1] -= n
arr[i] += n
n = 0
break
print(" ".join(map(str,arr)))
댓글남기기