πŸ’― CodingTest/BaekJoon

[BaekJoon] 17626번 Four Squares

S.Honey 2022. 6. 3. 16:24

β–Ά 문제 : https://www.acmicpc.net/problem/17626

 

17626번: Four Squares

λΌκ·Έλž‘μ£ΌλŠ” 1770년에 λͺ¨λ“  μžμ—°μˆ˜λŠ” λ„· ν˜Ήμ€ κ·Έ μ΄ν•˜μ˜ 제곱수의 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€κ³  증λͺ…ν•˜μ˜€λ‹€. μ–΄λ–€ μžμ—°μˆ˜λŠ” 볡수의 λ°©λ²•μœΌλ‘œ ν‘œν˜„λœλ‹€. 예λ₯Ό λ“€λ©΄, 26은 52κ³Ό 12의 합이닀; λ˜ν•œ 42 + 32 + 1

www.acmicpc.net

 

β–Ά μ½”λ“œ :

 

const input = require('fs').readFileSync('BaekJoon/testcase.txt').toString().trim().split('\n');

let n = Number(input[0]);

const dp = Array(50001);
dp[0] = 0;
dp[1] = 1;


for(let i = 1; i < n+1; i++){
    let count = 0;
    let temp = i;
    while(temp != 0){
        const num = parseInt(Math.sqrt(temp)) ** 2;
        temp -= num;
        count += 1;
    }
    dp[i] = count;

    for(let j = 1; j < parseInt(Math.sqrt(i)) + 1; j++){
        dp[i] = Math.min(dp[i], dp[j ** 2] + dp[i - (j**2)]);
    }
}

console.log(dp[n])

 

β–Ά 문제 풀이 :

1. DP 와 κ΄€λ ¨ν•˜μ—¬ μ‘°κΈˆμ€ 생각도 κΈΈκ²Œν•΄μ•Όν•˜κ³  λ²„κ±°μ›Œ 검색을 ν•΄λ³΄μ•˜λ‹€.  

 

[μ°Έμ‘°] : https://velog.io/@kyy00n/%EB%B0%B1%EC%A4%80-17626%EB%B2%88-Four-Squares

 

[λ°±μ€€] 17626번: Four Squares

λΌκ·Έλž‘μ£ΌλŠ” 1770년에 λͺ¨λ“  μžμ—°μˆ˜λŠ” λ„· ν˜Ήμ€ κ·Έ μ΄ν•˜μ˜ 제곱수의 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€κ³  증λͺ…ν•˜μ˜€λ‹€.

velog.io

2. μœ„μ˜ μ‚¬μ΄νŠΈμ—μ„œ Python 을 μ΄μš©ν•΄ κ΅¬ν˜„ν•œ μ½”λ“œλ₯Ό μ°Έκ³ ν•΄ Javascript μ½”λ“œλ‘œ λ³€ν™˜ν•΄λ³΄λ©° 방법을 μ΄ν•΄ν•΄λ³΄μ•˜λ‹€.

3. 초기 1 ~ 50000κΉŒμ§€μ˜ μˆ«μžλ³„ μ΅œμ†Œ λΌκ·Έλž‘μ£Ό 수λ₯Ό μ €μž₯ν•  배열인 dp λ₯Ό μ„ μ–Έν•˜κ³  0κ³Ό 1을 μ΄ˆκΈ°ν™”ν•˜μ˜€λ‹€.

4. 이후 μž…λ ₯된 n 만큼 λ°˜λ³΅λ¬Έμ„ μˆœνšŒν•œλ‹€. 

5. λ‚΄λΆ€μ—μ„œλŠ” countλ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•˜κ³ , temp λ³€μˆ˜μ— i 값을 ν• λ‹Ήν•œλ‹€. 

6. 이후 temp κ°€ 0이 λ λ•ŒκΉŒμ§€ while문을 λŒλ©΄μ„œ numμ΄λΌλŠ” λ³€μˆ˜μ— ν˜„μž¬ temp κ°’μ˜ 제곱근의 μ œκ³±μ„ λΉΌμ€€λ‹€. μ΄λ•Œ countλŠ” 1을 μ¦κ°€μ‹œμΌœ tempμ—μ„œ λΊ„ 수 μžˆλŠ” κ°€μž₯ 큰 제곱근의 제곱수λ₯Ό λΊμ„λ•Œμ˜ countλ₯Ό dp에 μ €μž₯ν•œλ‹€.

7. μ΄λ ‡κ²Œ μš°μ„ μ μœΌλ‘œ count값을 κ΅¬ν•œλ’€ for문을 μ΄μš©ν•΄ 1 ~ (i 의 제곱근 μ •μˆ˜λΆ€μ˜ 제곱 + 1)κΉŒμ§€ μˆœνšŒν•˜λ©΄μ„œ ν˜„μž¬ dp에 μ €μž₯된 κ°’κ³Ό ν•΄λ‹Ή 수(i)λ₯Ό λ§Œλ“€ 수 μžˆλŠ” 제곱의 κ²½μš°μ— μ €μž₯된 dp κ°’μ˜ 합을 λΉ„κ΅ν•˜λ©° μ΅œμ†Œκ°’μ„ νƒμƒ‰ν•œ λ’€ dp[i]λ₯Ό μ—…λ°μ΄νŠΈν•œλ‹€. (λ¬Όλ‘  κ·ΈλŒ€λ‘œμΌ 수 μžˆκ² μ§€)

8. μ΄λ ‡κ²Œ λ°˜λ³΅λ¬Έμ„ μˆœνšŒν•œ λ’€ dp[μž…λ ₯ 숫자]λ₯Ό 좜λ ₯ν•˜λ©΄ 끄읕 ~