(1).백준 1914번 하노이 탑은 이전에 풀었던 것과 동일한 랭크였지만

이전 20 언더였던 문제와 다르게 100까지 기준치가 올라버렸는데

이걸 모두 연산하려면 무조건 에러가 발생하기 때문에 요구하는 20까지는 기존 연산대로 처리하고

그 외적으로는 결과 숫자만 처리하는 방식이 필요했다.

 

확인해보면 결국 1개 적은 블럭을 2번으로 옮기고

마지막 블럭을 3번으로 옮긴 다음 다시 2번에 있던 블럭을 3번으로 옮기기 때문에

다음 이동 수치는 2n + 1이 될 수밖에 없었고

결과가 너무 크기 떄문에 해당 부분은 BigInt를 사용해서 결과값을 저장하는 방식으로 빠르게 해결할 수 있었다.

 

 

const input = 100
const result = []
let count = 0n

const recurtion = (n, start, temp, end) => {
    if(n == 0){
        return
    }

    recurtion(n - 1, start, end, temp)
    result.push(start + ' ' + end)
    recurtion(n - 1, temp, start, end)
}
if(input <= 20){
    recurtion(input, '1', '2', '3')
    
    console.log(result.length)
    console.log(result.join('\n'))
}
else{
    let n = input
    while(n > 0){
        n--
        count = count * 2n + 1n
    }
    console.log(String(count))
}

 

 

 

(2).백준 10827번 a^b는 js에서는 지원되지 않는 정밀연산을 요구했는데

큰 수의 경우에는 간단하게 BigInt로 처리할 수 있었기 때문에 쉬웠지만 소숫점을 어떻게 처리할지 고민하다가

그냥 소수를 정수로 만들 수 있게 자릿수를 곱해준 다음 최종 연산에서 '.'의 위치를 조절하는 방식으로 하기로 했다.

 

처음에는 소수 여부를 판별하려고 했지만 문제에서 친절하게 모두 소수라고 해서 좀더 편하게 할 수 있었고

간단하게 .의 위치를 제곱수와 곱해준 10의 지수만큼 뒤에서부터 가져오는 방식으로 처리하려고 했는데

0.1과 같은 숫자의 경우 10을 곱하고 100제곱을 해도 1이기 때문에 뒤에 소수자릿수도 없기 떄문에

1보다 작은 경우에는 문제가 생긴다는 사실을 뒤늦게 알 수 있었다.

 

추가할 지수부분의 수량보다 길이가 작은 경우를 먼저 체크해준 다음

padStart로 0을 앞에 붙이고 그냥 문자열로 0.을 앞에 붙이는 방식으로 처리했고

뒤에는 처음 생각한 것 처럼 그냥 앞, 뒤를 지수부분의 숫자를 기준으로 잘라서 '.'의 앞, 뒤로 넣어주는 방식으로 처리했다.

const [num, pow] = `3.141592 3`.split(' ')
const dotIndex = num.indexOf('.')
const bigNum = BigInt(num.replace('.', ''))
let deciamlCount = num.length - 1 - dotIndex
let bigNumPow = 1n

for(let i = 0 ; i < pow ; i++){
    bigNumPow *= bigNum
}

const bigNumStr = String(bigNumPow)
const totalDecimalPlaces = deciamlCount * pow

if(bigNumStr.length <= totalDecimalPlaces){
    const padded = bigNumStr.padStart(totalDecimalPlaces, '0')
    console.log(`0.${padded}`)
} 
else{
    const integerPart = bigNumStr.slice(0, bigNumStr.length - totalDecimalPlaces)
    const decimalPart = bigNumStr.slice(bigNumStr.length - totalDecimalPlaces)
    console.log(`${integerPart}.${decimalPart}`)
}

'회고' 카테고리의 다른 글

[개발일지] - 533  (1) 2024.12.17
[개발일지] - 532  (0) 2024.12.16
[개발일지] - 530(주말)  (0) 2024.12.14
[개발일지] - 529  (3) 2024.12.13
[개발일지] - 528  (0) 2024.12.12

+ Recent posts