[Python] 백준/BOJ 5376번: 소수를 분수로 (Silver 1)

2025. 10. 1. 12:29·Algorithm/백준 (BOJ)
반응형

💻 Problem

문제 보러 가기

 

유리수 분수를 소수로 나타내면, 소수점 아래 자리가 유한 개인 경우(1/8 = 0.125)와 어떤 자리에서부터 일정한 숫자가 한없이 되풀이되는 경우(1/11 = 0.090909...)가 있다.

소수를 입력받은 뒤, 분수로 나타내는 프로그램을 작성하시오.

 

예제 입력 1 

3
0.5
0.(3)
0.6(142857)

예제 출력 1 

1/2
1/3
43/70

 

💡 Approach

순환소수를 분수로 나타내는 문제이다.

순환소수를 분수로 변환하는 법을 노트에 정리해 봤다.

 

이를 바탕으로 구현하면 된다.

입력을 슬라이싱해서 소수 뒷부분만 살펴보도록 했다.

 

주어진 소수가 유한소수일 경우, 분자는 소수 뒷부분 그대로이고 분모는 10^(소수 뒷부분 길이)가 된다.

 

주어진 소수가 무한소수(순환소수)일 경우, 소수 뒷부분을 비반복 구간과 반복 구간으로 나눈다.

  • k: 비반복 구간 (길이: m)
  • r: 반복 구간 (길이: n)

분자는 int(k + r) - int(k or '0')이 되고,

  • 숫자로 생각하면 실제 값은 (k * (10 ** n) + r) - k이지만
  • k와 r이 문자열이므로 그냥 두 문자열을 합치면 된다.

분모는 (10 ** (m + n)) - (10 ** m)이 된다.

 

분자와 분모를 구했으면 둘의 최대공약수를 구한다.

그러고 나서 각 분자와 분모를 최대공약수로 나눠주면 된다.

 

✏️ Solution

import sys
from math import gcd
input = sys.stdin.readline

for _ in range(int(input())):
    s = input().rstrip()[2:]

    if '(' not in s:
        numerator = int(s) # 분자
        denominator = 10 ** len(s) # 분모

    else:
        i = s.index('(')
        k = s[:i] # 비반복 구간
        r = s[i + 1:-1] # 반복 구간

        m = len(k) # 비반복 구간 길이
        n = len(r) # 반복 구간 길이

        numerator = int(k + r) - int(k or '0')
        denominator = (10 ** (m + n)) - (10 ** m)

    g = gcd(numerator, denominator) # 최대공약수
    print(f'{numerator // g}/{denominator // g}')

 

반응형
'Algorithm/백준 (BOJ)' 카테고리의 다른 글
  • [Python] 백준/BOJ 20207번: 달력 (Gold 5)
  • [Python] 백준/BOJ 17124번: 두 개의 배열 (Silver 3)
  • [Python] 백준/BOJ 18234번: 당근 훔쳐 먹기 (Gold 3)
  • [Python] 백준/BOJ 2597번: 줄자접기 (Silver 3)
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (206)
      • SSAFY (10)
      • Algorithm (120)
        • 이론 (6)
        • 백준 (BOJ) (112)
        • 프로그래머스 (1)
        • 코드트리 (1)
      • Trouble Shooting (10)
      • Frontend (7)
      • React (17)
      • Next.js (5)
      • Vue (4)
      • Node.js (2)
      • HTML (9)
      • DevOps (4)
        • Git (4)
      • Language (9)
        • JavaScript (0)
        • Java (9)
      • Embedded (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
      • 자격증 (2)
      • 기타 (1)
        • Tistory (1)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    재귀
    DP
    SSAFY
    파이썬
    싸피
    오블완
    구현
    Error
    블록체인
    Java
    백준
    힙
    백트래킹
    Heap
    bfs
    우선순위큐
    Algorithm
    브루트포스
    dfs
    강의
    SSAFYcial
    그리디
    Next.js
    수학
    중복순열
    html5
    순열
    React
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
올콩
[Python] 백준/BOJ 5376번: 소수를 분수로 (Silver 1)
상단으로

티스토리툴바