๋ฉ๋ฆฌ๋ฐ๊ธฐ ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/12914
์ด์ (์ฌ๊ท)
์ ๋ณด๋ฉด ํผ๋ณด๋์น ์์ด์ ๊ตฌํ๋ ๋ฌธ์ ์์ ์ ์ ์๋ค. ๊ทธ๋์ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํด ํ์๋๋ฐ ์๊ฐ ์ด๊ณผ๋ก ํ๋ฝ.
function solution3(n) {
let answer = 0;
function backtrack(n) {
if (n < 2) {
return 1;
}
return backtrack(n - 1) + backtrack(n - 2);
}
answer = backtrack(n) % 1234567;
return answer;
}
์์ ์ 1 (๋ฐ๋ณต๋ฌธ, ๋ฐฐ์ด)
function solution2(n) {
var answer = 0;
let arr = [0, 1, 2];
for (let i = 3; i <= n; i++) {
let num = arr[i - 2] + arr[i - 1];
arr.push(num);
console.log(arr[arr.length - 1]);
}
answer = arr[n] % 1234567;
return answer;
}
์ด๋ ๊ฒ ๋ฐฐ์ด์ ์ฌ์ฉํด ์ค๋ณต ๊ณ์ฐ์ ํผํ๊ณ ๋ค์ ๋ ์ซ์๋ค์ ๋ํ๋๋ก ๋ง๋ค์๋ค.
์ฌ๊ทํธ์ถ์ ๋จ์
์ฌ๊ท๋ฐฉ์ ํ์ด์ ๋จ์ ์ backtrack(n)์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋์ง ์๋๋ค๋ ๊ฒ.
5์ ํผ๋ณด๋์น ์์ด์ ๊ตฌํ ๋ ์ฌ๊ท์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ด ์๋๋ก ๋ด๋ ค๊ฐ๋ฉด์ ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํ๋ค.
// 5๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ 4์ 3์ ๊ตฌํด์ผํ๋๋ฐ, 4๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ 3๊ณผ 2๋ฅผ ๊ตฌํด์ผํ๊ณ , ๋ค์ 3์ ๊ตฌํ๊ธฐ ์ํด์ ....
5 : backtrack(4) + backtrack(3)
4 : backtrack(3) + backtrack(2)
3 : backtrack(2) + backtrack(1)
2 : backtrack(1) + backtrack(0)
1 : 1
0 : 0
backtrack(3)์ ๊ฒฐ๊ณผ๋ 3์ด๊ณ , backtrack(4)์ ๊ฒฐ๊ณผ๋ 5 ๋ผ๋ ์ฌ์ค์ ์ด๋์ ์ ์ฅํด ๋๋ค๋ฉด? backtrack(5)๋ฅผ ํ ๋ ๊ตณ์ด 3๊ณผ 4์ ๊ฒฝ์ฐ๋ก ๋๋์ด ์ฌ๊ทํจ์ ํธ์ถ์ ํ๋ ๋์ ๋ ์ซ์๋ฅผ ๋ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์์ ๊ฒฐ๊ณผ๋ ์ ์ฅ๋์ด์๋ค๋ฉด backtrack(6)์ ๋ ๊ตณ์ด ์ฌ๊ทํจ์ ํธ์ถ์ ๋ฐ๋ณตํ๋ ๋์ ๋ ๋ ์ซ์๋ฅผ ๋ํ๋ ๊ฐ๋จํ ์ฐ์ฐ๋ง ์ํํ๋ฉด ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ์ ์ถํด๋ณด๋ ์ด๋ฒ์๋ ์๊ฐ ์ด๊ณผ๊ฐ ์๋๋ผ ์์ ์ค๋ต์ด๋ผ๊ณ ํ๋ค.
๋ต์
์์ ์์ด ์ค๋ต์ด๋ผ๊ณ ๋์จ ์์ธ์ ๋ง์ง๋ง์ ๋ต์ ๋ฐํํ ๋์๋ง ๋ชจ๋๋ฌ ์ฐ์ฐ์ ๋ฃ์ด์คฌ๊ธฐ ๋๋ฌธ์ด๋ค.
ํผ๋ณด๋์น ์์ด์ ๊ตฌํ ๋ 1477๋ถํฐ ์๋ฐ์คํฌ๋ฆฝํธ์ Number.MAX_VALUE๋ฅผ ์ด๊ณผํ๊ฒ ๋๊ณ , ๊ทธ ๋ค๋ก ๋ชจ๋ ์ซ์๋ infinity๋ผ๊ณ ์ ์ฅ๋๋ค.
infinity % 1234567์ ์ซ์๊ฐ ์๋๋ NaN์ด ๋๋๊ฒ์ด๊ณ ๊ทธ๋์ ํ๋ ธ๋๊ฒ.
function solution(n) {
var answer = 0;
let arr = [0, 1, 2];
for (let i = 3; i <= n; i++) {
let num = arr[i - 2] + arr[i - 1];
arr.push(num % 1234567);
console.log(arr[arr.length - 1]);
}
answer = arr[n];
return answer;
}
๋ชจ๋๋ฌ ์ฐ์ฐ์ ํน์ง
๊ทธ๋ฐ๋ฐ ๋ชจ๋๋ฌ ์ฐ์ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐํ ๋ ํ๋๊ฒ๊ณผ ๋ง์ง๋ง์ ๋ฐํํ ๋๋ง ํ๋๊ฒ์ด ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ ๊ฐ์ง๊น? ์ฆ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๊ณ๋ฅผ ๋์ด์ ์ง์ง ์ซ์๋ฅผ ๊ณ์ฐํ ์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ
arr.push((arr[i-2] + arr[i-2]) % 1234567);
//...
return arr[n];
์ด๊ฒ ์ฒ๋ผ ๋ฐฐ์ด์ ๋ฃ์๋ ๋ง๋ค ๋ชจ๋๋ฌ ์ฐ์ฐ์ ํ ํ์ ๋ฃ๋ ๊ฒ๊ณผ
arr.push(arr[i-2] + arr[i-1])
//...
return arr[n] % 1234567;
์ด๊ฒ ์ฒ๋ผ ๋ง์ง๋ง์๋ง ๋ชจ๋๋ฌ ์ฐ์ฐ์ ๊ฑฐ์น๊ณ ๋ฐํํ๋๊ฒ์ด ์ํ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ ๊ฐ์ง๊น?
์์ ์์
6์ ํผ๋ณด๋์น ์์ด์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํด๋ณธ๋ค.
- ์ซ์๋ฅผ ๋ฐฐ์ด์ ๋ด์๋๋ง๋ค 3 ๋ชจ๋๋ฌ ์ฐ์ฐ์ ํ๋ค.
- ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๋๋ง 3 ๋ชจ๋๋ฌ ์ฐ์ฐ์ ํ๋ค.
1๋ฒ ๋ฐฉ๋ฒ
์์ : arr = [0,1]
2 : 0+1=1, 1 % 3 = 1 , [0,1,1]
3 : 1+1=2, 2 % 3 = 2 , [0,1,1,2]
4 : 1+2=3, 3 % 3 = 0 , [0,1,1,2,0]
5 : 2+0=2, 2 % 3 = 2 , [0,1,1,2,0,2]
6 : 0+2=2, 2 % 3 = 2 , [0,1,1,2,0,2,2]
arr[6] = 2
2๋ฒ ๋ฐฉ๋ฒ
์์ : arr = [0,1]
2 : 0+1=1, [0,1,1]
3 : 1+1=2, [0,1,1,2]
4 : 1+2=3, [0,1,1,2,3]
5 : 2+3=5, [0,1,1,2,3,5]
6 : 3+5=8, [0,1,1,2,3,5,8]
arr[6] % 3 = 2
์๋ฆฌ
์ซ์ n๊ณผ m์ด ์๋ค. ์ด ๋ ์ซ์๋ a๋ผ๋ ์ซ์๋ก ๋๋์์๋ ์ด๋ ๊ฒ ํํ๋ ์ ์๋ค.
- n = xa + r1
- m = ya + r2
n+m = (xa + r1) + (ya + r2) = a(x + y) + (r1 + r2)
์์ ์์์ ์์ ๋ถ๋ถ a(x + y) ๋ ๋น์ฐํ a๋ก ๋๋์ด ๋จ์ด์ง๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ r1 + r2 ๋ง ๋จ๊ฒ ๋๋ค. ๊ทธ๋์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋๋จธ์ง๋ผ๋ฆฌ ๋ํ๋๊ฒ๊ณผ ๊ฐ๊ฒ ๋๋ค.