ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LeetCode] 166. Fraction to Recurring Decimal
    ComputerScience/Algorithm 2024. 4. 9. 15:13
    728x90

    문제

    성능 요약

    메모리: 16.9MB, 시간: 26ms

    분류

    • ?

    접근 방법

    리트코드로 문제를 푸는 것이 처음이어서, class를 활용한 디버깅 방법 등을 연구하느라 시간이 좀 걸렸다.

     

    문제로에서는 분수가 반복되는 부분을 찾는 것이 관건이겠다 생각했다.

    class Solution:
        def fractionToDecimal(self, numerator: int, denominator: int) -> str:   
            ans = ""
            ans2 = ""
            n = numerator
            d = denominator
            if n % d == 0:
                return str(n//d)
            else:
                if len(str(n/d)) > 10:
                    ans += str(n/d).split(".")[1]
                    for i in ans:
                        if i in ans2:
                            break
                        ans2 += i
                        
                    return str(n//d)+ "." + "(" + ans2 + ")"
                return str(n/d)

     

    따라서 다음과 같이 if문을 나누고 난 다음, "."을 기준으로 소수부를 구해서 반복되는 부분을 in이나 not in을 통해 해결하려 하였으나, numerator가 1이고 denominator가 6일때 즉, 0.1666666...일 때 예외 처리가 되지 않았다.

     

    시간을 너무 잡아 먹는 것 같아 답을 참고하였다.

    정답

    class Solution:
        def fractionToDecimal(self, numerator: int, denominator: int) -> str:
            # Handle edge cases
            if numerator == 0:
                return "0"
            if denominator == 0:
                return ""
    
            # Initialize result and check for negative sign
            result = ""
            if (numerator < 0) ^ (denominator < 0):
                result += "-"
            numerator, denominator = abs(numerator), abs(denominator)
    
            # Integer part of the result
            result += str(numerator // denominator)
    
            # Check if there is a fractional part
            if numerator % denominator == 0:
                return result
    
            result += "."
    
            # Use a dictionary to store the position of each remainder
            remainder_dict = {}
            remainder = numerator % denominator
    
            # Keep adding the remainder to the result until it repeats or the remainder becomes 0
            while remainder != 0 and remainder not in remainder_dict:
                remainder_dict[remainder] = len(result)
                remainder *= 10
                result += str(remainder // denominator)
                remainder %= denominator
    
            # Check if there is a repeating part
            if remainder in remainder_dict:
                result = result[:remainder_dict[remainder]] + "(" + result[remainder_dict[remainder]:] + ")"
    
            return result

     

    후기

    접근 방법은 나랑 비슷했는데, 결국 반복된 부분을 찾는 것이 좀 달랐다.

     

    나누어 떨어지면 정수부만 바로 return하는 것, 나누어 떨어지지 않을 경우 반복되는 부분만 담아서 result에 넣는 것.

    result에 정수부, ".", 소수부를 차례로 result에 더해나가는 것이 인상적이었던 것 같다.

     

    소수부의 경우 딕셔너리를 사용해서 반복되는 부분만 담고, 그 반복이 시작되는 부분의 인덱스 즉, len(result)를 담아서 result에 담는다.

    그리고 최종적으로 result에 슬라이싱을 더해서 return한다.

     

    처음에 print를 사용해서 함수를 작성하니까, output이 아니라 stdout으로만 결과가 나와서 테스트케이스를 처리 못하였다.

    리트코드는 이런 식으로 바로 출력하는 것 말고 함수 작성을 통해 return하는 것을 추구한다는 것을 처음 알게 되었다.

     

     

    'ComputerScience > Algorithm' 카테고리의 다른 글

    [BOJ] 두 수 비교하기 - 1330  (0) 2024.09.11
    [LeetCode] 367. Valid Perfect Score  (0) 2024.04.09
    [BOJ] 히든 넘버 - 8595  (0) 2024.04.09
    [BOJ] 8진수, 10진수, 16진수 - 11816  (0) 2024.04.06
    [BOJ] 숫자의 합 - 11720  (0) 2024.04.05
Designed by Tistory.