LeetCode - 166. Fraction to Recurring Decimal

요리하는코더·2021년 10월 5일
0

알고리즘 - 문제

목록 보기
23/48
post-thumbnail

코드

/**
 * @param {number} numerator
 * @param {number} denominator
 * @return {string}
 */
var fractionToDecimal = function(numerator, denominator) {
    
    // 음수 고려해야 함 처음에 못했음
    
    let answer =''
    if(numerator / denominator < 0) {
        answer = '-'
        numerator = Math.abs(numerator)
        denominator = Math.abs(denominator)
    }
    
    if(numerator % denominator === 0) {
        answer += numerator / denominator
        return answer;
    }

    let memo = []
    let divisor = BigInt(numerator) / BigInt(denominator)
    answer += divisor + '.'
    numerator = numerator % denominator
    
    let check= answer.length
    let idx;
    
    memo.push(numerator);
    numerator *= 10;
    while(1) {
        // BigInt는 알아서 소수점을 버리므로 parseInt 필요 X
        const divisor = BigInt(numerator) / BigInt(denominator)
        const reminder = BigInt(numerator) % BigInt(denominator)
        idx = memo.indexOf(reminder)
        
        answer += divisor;
        if(idx !== -1) {
          // 소수 중복되는 부분 괄호 처리
            answer = answer.split('')
            answer.splice(check+idx,0,'(');
            answer = answer.join('') + ')';
            break;
        } else {
            if(reminder === 0n) break;
            memo.push(reminder)
        }
        numerator = BigInt(reminder) * BigInt(10);
    }
    
    return answer;
};

풀이 및 소감

신경써야하는 게 많은 문제였다. 그리고 코드가 너무 지저분한거 같아서 아쉬운데 ㅠㅠ 아는 형이 푼 코드 만약 받으면 좀 비교하면서 고쳐봐야겠다. 그리고 BigInt를 거의 사용 안해봤는데 덕분에 사용할 수 있었다. 틀리면 알려주는 케이스에 따라서 코드를 수정했는데 다음에는 좀 더 다양한 케이스를 한번에 처리할 수 있게 구현해봐야겠다.

profile
요리 좋아하는 코린이

0개의 댓글