-
[LeetCode] 166. Fraction to Recurring DecimalComputerScience/Algorithm 2024. 4. 9. 15:13728x90
문제
접근 방법
리트코드로 문제를 푸는 것이 처음이어서, 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