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

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค[Java] - ๋ฉ€๋ฆฌ ๋›ฐ๊ธฐ(DP)

by ์ฃผ๋ฐœ2 2020. 3. 3.
๋ฐ˜์‘ํ˜•

https://programmers.co.kr/learn/courses/30/lessons/12914

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ฉ€๋ฆฌ ๋›ฐ๊ธฐ | ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

ํšจ์ง„์ด๋Š” ๋ฉ€๋ฆฌ ๋›ฐ๊ธฐ๋ฅผ ์—ฐ์Šตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํšจ์ง„์ด๋Š” ํ•œ๋ฒˆ์— 1์นธ, ๋˜๋Š” 2์นธ์„ ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นธ์ด ์ด 4๊ฐœ ์žˆ์„ ๋•Œ, ํšจ์ง„์ด๋Š” (1์นธ, 1์นธ, 1์นธ, 1์นธ) (1์นธ, 2์นธ, 1์นธ) (1์นธ, 1์นธ, 2์นธ) (2์นธ, 1์นธ, 1์นธ) (2์นธ, 2์นธ) ์˜ 5๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งจ ๋ ์นธ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ€๋ฆฌ๋›ฐ๊ธฐ์— ์‚ฌ์šฉ๋  ์นธ์˜ ์ˆ˜ n์ด ์ฃผ์–ด์งˆ ๋•Œ, ํšจ์ง„์ด๊ฐ€ ๋์— ๋„๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช‡ ๊ฐ€์ง€์ธ์ง€ ์•Œ์•„๋‚ด, ์—ฌ๊ธฐ์— 1234567๋ฅผ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜, solut

programmers.co.kr

์ฝ”๋“œ

class Solution {
  public long solution(int n) {
      int[] dp = new int[2001];
      dp[1] = 1;
      dp[2] = 2;
      for(int i=3; i<2001; i++){
          dp[i] = (dp[i-2] + dp[i-1]) % 1234567;
      }
      return dp[n];
  }
}

ํ’€์ด

Level3์— ์กด์žฌํ•˜๋Š” ๋ฌธ์ œ์ง€๋งŒ, ๊ฐ„๋‹จํ•œ DP๋ฌธ์ œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๋ฅผ ๋ณด์ง„ ์•Š์•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ๋ณด๋‹ˆ DP๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์„œ ๊ทœ์น™์„ ๋ณด์•˜๋‹ค.

 

์นธ์ด ์ด 4๊ฐœ์žˆ์„ ๋•Œ, ๋ฐฉ๋ฒ•์€ 5๊ฐ€์ง€๋‹ค

1 + 1 + 1 + 1

1 + 2 + 1

2 + 1 + 1

1 + 1 + 2

2 + 2

 

์นธ์ด ์ด 3๊ฐœ์žˆ์„ ๋•Œ, ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€๋‹ค.

1 + 1 + 1

1 + 2

2 + 1

 

์นธ์ด ์ด 2๊ฐœ์žˆ์„ ๋•Œ, ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๋‹ค.

1 + 1

2

 

n = 4์ผ๋•Œ๋ฅผ ๋‹ค์‹œ ๋ณด์ž.

๋งˆ์ง€๋ง‰์— 1์นธ์„ ๋›ธ ๊ฒฝ์šฐ(๋นจ๊ฐ„์ƒ‰ ์ˆซ์ž) ๊ทธ ์•ž์นธ(n = 3)์˜ ๋ฐฉ๋ฒ•์—์„œ +1๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ dp[i-1]

๋งˆ์ง€๋ง‰์— 2์นธ์„ ๋›ธ ๊ฒฝ์šฐ(๋ณด๋ผ์ƒ‰ ์ˆซ์ž) ๊ทธ ์•ž์•ž์นธ(n = 2)์˜ ๋ฐฉ๋ฒ•์—์„œ +2๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ dp[i-2]

 

x + ... + x + 1

x + ... + x + 2

 

๋งˆ์ง€๋ง‰์— 1์นธ์„ ๋›ฐ์–ด ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ์•ž์นธ์„ ๋ฐŸ๊ณ  1์นธ์„ ๋›ด ๊ฒฝ์šฐ์ด๋ฏ€๋กœ, dp[i-1] ์ด๋‹ค.

๋งˆ์ง€๋ง‰์— 2์นธ์„ ๋›ฐ์–ด ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ์•ž์•ž์นธ์„ ๋ฐŸ๊ณ  2์นธ์„ ๋›ด ๊ฒฝ์šฐ์ด๋ฏ€๋กœ, dp[i-2]์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

dp[i] = dp[i-2] + dp[i-1]

 

n์˜ ๋ฒ”์œ„๊ฐ€ 2000๊นŒ์ง€์ด๋ฏ€๋กœ, n์ด ์ผ์ • ์ˆ˜ ์ด์ƒ์—์„  int๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฏ€๋กœ,

dp[i]๊ฐ’์„ ์ €์žฅํ• ๋•Œ 1234567์„ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋กœ ์ €์žฅํ•œ๋‹ค.(๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง)

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€