본문 바로가기

백준

백준2685 - 님비합

https://www.acmicpc.net/problem/2685

 

2685번: 님비합

문제 Nim 게임은 몇 개의 돌무더기를 놓고 매 차례마다 각 플레이어가 한 무더기에서 적게는 1개에서부터 많게는 무더기 전체를 가져가는 게임이다. 일반적인 Nim 게임의 승자는 마지막으로 돌을

www.acmicpc.net

오랜만에 알고리즘 문제를 풀었다. 쉬운걸로 골라서 풀었다. 캐리가 발생하면 무시해주고 일의 자리만 계산에 반영하면 끝나는 쉬운 문제이다. 처음으로 스프레드 연산자를 이용하여 알고리즘 문제를 풀었다.

const readline = require('readline')

let T = 0

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

const parseValue = (line) => {
    return line.split(' ').map(x => { return parseInt(x) })
}

const pipe = (...fns) => value => fns.reduce((acc, fn) => fn(acc), value)

const make_Nim = (num, N, arr) =>{
    while(num) {
        arr.unshift(num % N)
        num = Math.floor(num / N)
    }
}

const solution = (B, X, Y) => {
    const X_arr = [], Y_arr = []
    
    make_Nim(X, B, X_arr)
    make_Nim(Y, B, Y_arr)

    const num = Math.abs(X_arr.length - Y_arr.length)

    if(X_arr.length > Y_arr.length) {
        for(let i = 0; i < num; i++) {
            Y_arr.unshift(0)
        }
    }
    else if(X_arr.length < Y_arr.length) {
        for(let i = 0; i < num; i++) {
            X_arr.unshift(0)
        }
    }

    const ans = X_arr.reduce((acc, curr, idx) => {
        const res = ((curr) + Y_arr[idx]) % B
        acc.push(res)
        return acc
    }, []).reverse().reduce((acc, curr, idx) => {
        acc += curr * Math.pow(B, idx)
        return acc
    }, 0)
    
    console.log(ans)
}

rl.on('line', line => {
    if(T === 0) {
        T = parseInt(line)
    }
    else {
        const res = pipe(
            x => parseValue(x),
            x => solution(...x)
        )(line)
        T--
    }
    if(T === 0) {
        rl.close()
    }
}).on('close', _ =>{
    process.exit()
})

'백준' 카테고리의 다른 글

백준16922 - 로마 숫자 만들기  (0) 2021.01.26
백준12904 - A와 B  (0) 2021.01.25
백준2980 - 도로와 신호등  (0) 2020.08.09
백준14562 - 태권왕  (0) 2020.08.06
백준4470 - 줄번호  (0) 2020.08.06