Leetcode Java Fraction to Recurring Decimal

업데이트:

문제

Link

코드

class Solution {

  public String fractionToDecimal(int numerator, int denominator) {
    StringBuilder result = new StringBuilder();
    if ((numerator > 0 && denominator < 0) || (numerator < 0 && denominator > 0)) {
      result.append("-");
    }
    long numeratorLong = Math.abs((long) numerator);
    long denominatorLong = Math.abs((long) denominator);
    result.append(numeratorLong / denominatorLong);
    long remainder = numeratorLong % denominatorLong;
    if (remainder == 0) {
      return result.toString();
    }
    result.append(".");
    Map<Long, Integer> map = new HashMap<>();
    while (remainder != 0) {
      if (!map.containsKey(remainder)) {
        map.put(remainder, result.length());
      } else {
        result.insert(map.get(remainder), "(");
        result.append(")");
        return result.toString();
      }
      remainder *= 10;
      result.append(remainder / denominatorLong);
      remainder %= denominatorLong;
    }
    return result.toString();
  }

}

결과

Link

설명

  1. 주어진 분수 표기법의 변수들인 numerator(분자)와 denominator(분모)를 이용하여 소수 표기법으로 변환하는 문제이다.
    • 단, 순환소수인 경우 순환마디를 소괄호()로 감싸 표기한다.
  2. 결과를 동적으로 생성하기 위해 StringBuilder인 result를 정의한다.
    • 동적 문자열의 생성시, 효율적인 메모리 사용을 위해 StringBuilder를 사용한다.
  3. 주어진 분자인 numerator와 분모인 denominator의 곱이 음의 정수(-)가 되는 경우는 초기 값에 “-“ 기호를 넣어준다.

  4. 주어진 분자인 numerator와 분모인 denominator을 양의 정수인 long 형태로 각각 변경하여 numeratorLong과 denominatorLong을 정의한다.

  5. result에 $\frac{numeratorLong}{denominatorLong}$의 정수 값을 넣어주고, 나머지 값은 remainder 변수를 정의하여 넣어준다.
    • remainder가 0일 경우 나눗셈의 결과가 정수가 되는 경우이므로, result를 문자형으로 전환하여 주어진 문제의 결과로 반환한다.
  6. result에 소수점(.)을 추가하고, 순환마디를 구하기 위해 map을 정의하고 remainder가 0이 아닐 때 까지 반복하여 result를 완성한다.
    • map에 remainder가 key로 존재하지 않은 경우, 아래를 수행한다.
      • key는 remainder, value는 순환마디의 시작 위치인 result의 길이로 넣어준다.
      • remainder에 10을 곱하여 result에 $\frac{remainder}{dominatorLong}$의 정수 값을 넣어주고, remainder에는 나머지 값을 넣어주고 반복을 계속 수행한다.
    • map에 remainder가 key로 존재하는 경우, 아래를 수행한다.
      • map에서 해당 remainder 값인 순환마디의 시작 위치를 가져와 해당 위치에 “(“ 문자를 넣어주고, result에 “)”문자를 넣어 순환 마디를 소괄호()로 감싸준다.
      • 순환소수가 저장된 result를 문자형으로 전환하여 주어진 문제의 결과로 반환한다.
  7. 반복이 완료되면 순환소수가 아닌 result를 문자형으로 전환하여 주어진 문제의 결과로 반환한다.

소스

Sample Code는 여기에서 확인 가능합니다.

댓글남기기