๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[Javascript] 2 * n ํƒ€์ผ๋ง (12900)

๋ฌธ์ œ๋งํฌ

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - 2 x n ํƒ€์ผ๋ง

๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ 2์ด๊ณ  ์„ธ๋กœ์˜ ๊ธธ์ด๊ฐ€ 1์ธ ์ง์‚ฌ๊ฐํ˜•๋ชจ์–‘์˜ ํƒ€์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ง์‚ฌ๊ฐํ˜• ํƒ€์ผ์„ ์ด์šฉํ•˜์—ฌ ์„ธ๋กœ์˜ ๊ธธ์ด๊ฐ€ 2์ด๊ณ  ๊ฐ€๋กœ์˜ ๊ธธ์ด๊ฐ€ n์ธ ๋ฐ”๋‹ฅ์„ ๊ฐ€๋“ ์ฑ„์šฐ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ผ์„ ์ฑ„์šธ ๋•Œ๋Š”

programmers.co.kr

์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ฒ˜์Œ์—” n์ด ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ, ์ง์ˆ˜์ธ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ ์„œ
์ˆœ์—ด ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค.

๊ฐ€๋กœ์˜ ๊ธธ์ด๊ฐ€ 8์ธ ํƒ€์ผ์€ 8P8 + 7P6 + 6P4 + 5P2 + 4P0์ด๊ณ 
๊ฐ€๋กœ์˜ ๊ธธ์ด๊ฐ€ 7์ธ ํƒ€์ผ์€ 7P7 + 6P5 + 5P3 + 4P1์ด๊ธฐ ๋•Œ๋ฌธ์—

ํ•˜์ง€๋งŒ n์˜ ๋„ˆ๋ฌด ๋ฒ”์œ„๊ฐ€ ๋„“๊ณ  ํšจ์œจ์„ฑ์ด ๋‚ฎ์€ factorial์„ ์‚ฌ์šฉํ•ด์„œ ํ†ต๊ณผ๋ฅผ ํ•˜์ง€ ๋ชปํ•˜์˜€๋‹ค. (๋‚ฎ์€ ์ˆ˜์—์„œ๋Š” ์ œ๋Œ€๋กœ ํƒ€์ผ์˜ ์ˆ˜๋ฅผ ์ฐพ๊ธด ํ•˜์˜€๋‹ค.)

๊ทธ๋ž˜์„œ ๋‹ค์‹œ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ
1์ผ๋•Œ 1P1 = 1
2์ผ๋•Œ 2P2 + 1P0 = 2
3์ผ๋•Œ 3P3 + 2P1 = 3
4์ผ๋•Œ 4P4 + 3P2 + 2P0 = 5
5์ผ๋•Œ 5P5 + 4P3 + 3P1 = 8

[n] = [n-1] + [n-2] ๋ผ๋Š” ํŠน์ง•์„ ๊ฐ–๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ dp ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค.

์ฃผ์˜์ 

n์ด 60000๊นŒ์ง€์˜ ํฐ ๋ฒ”์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค. 
๋•Œ๋ฌธ์— ๋ฌธ์ œ์˜ ์กฐ๊ฑด์—์„œ๋„ ๋„์ถœ๊ฐ’ answer์— 1000000007์„ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ ๊ฐ’์„ ๊ตฌํ•˜๋ผ ํ•˜์˜€๋Š”๋ฐ,
์ตœ์ข…์ ์ธ ๊ฐ’ answer์— 1000000007์„ %ํ•˜๋ฉด ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์—†๋‹ค.

for(let i = 2; i < n; i++){
    dp[i] = (dp[i-1] + dp[i-2]) % 1000000007;
}

 

์ด์ฒ˜๋Ÿผ ์ค‘๊ฐ„์— for๋ฌธ์—์„œ ์ฒ˜๋ฆฌํ•ด ์ค˜์•ผ ํ•œ๋‹ค.

 

// dp ์ฝ”๋“œ

function solution(n) {
    var answer = 0;
    let dp = new Array(n).fill(0);
    dp[0] = 1;
    dp[1] = 2;
    
    for(let i = 2; i < n; i++){
        dp[i] = (dp[i-1] + dp[i-2]) % 1000000007;
    }
    answer = dp[n-1]
    return answer;
}

 

// ์ˆœ์—ด์„ ์‚ฌ์šฉํ•œ ํ’€์ด
function solution(n) {
    var answer = 0;
    if(n % 2 === 0){
        for(let oneLenTile = n, totalTile = n; oneLenTile >= 0; oneLenTile -= 2, totalTile--){
            answer += permutation(totalTile, oneLenTile)
        }
    }else{
        for(let oneLenTile = n, totalTile = n; oneLenTile > 0; oneLenTile -= 2, totalTile--){
            answer += permutation(totalTile, oneLenTile)
        }
    }
    return answer % 1000000007;
}

const factorial = (num) => {
    if(num === 0) return 1;
    
    return num * factorial(num - 1)
}

const permutation = (num1, num2) => {
    return factorial(num1) / (factorial(num2) * factorial(num1 - num2))
}