πŸ’»

[λ°±μ€€] λ™μ κ³„νšλ²• - 2579. 계단 였λ₯΄κΈ° λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] λ™μ κ³„νšλ²• - 2579. 계단 였λ₯΄κΈ°

λ˜νš¨λ‹ˆ 2020. 2. 25. 22:32

문제

계단 였λ₯΄κΈ° κ²Œμž„μ€ 계단 μ•„λž˜ μ‹œμž‘μ λΆ€ν„° 계단 κΌ­λŒ€κΈ°μ— μœ„μΉ˜ν•œ λ„μ°©μ κΉŒμ§€ κ°€λŠ” κ²Œμž„μ΄λ‹€. <κ·Έλ¦Ό 1>κ³Ό 같이 각각의 κ³„λ‹¨μ—λŠ” μΌμ •ν•œ μ μˆ˜κ°€ μ“°μ—¬ μžˆλŠ”λ° 계단을 밟으면 κ·Έ 계단에 μ“°μ—¬ μžˆλŠ” 점수λ₯Ό μ–»κ²Œ λœλ‹€.

예λ₯Ό λ“€μ–΄ <κ·Έλ¦Ό 2>와 같이 μ‹œμž‘μ μ—μ„œλΆ€ν„° 첫 번째, 두 번째, λ„€ 번째, μ—¬μ„― 번째 계단을 λ°Ÿμ•„ 도착점에 λ„λ‹¬ν•˜λ©΄ 총 μ μˆ˜λŠ” 10 + 20 + 25 + 20 = 75점이 λœλ‹€.

계단 였λ₯΄λŠ” λ°λŠ” λ‹€μŒκ³Ό 같은 κ·œμΉ™μ΄ μžˆλ‹€.

  1. 계단은 ν•œ λ²ˆμ— ν•œ 계단씩 λ˜λŠ” 두 계단씩 였λ₯Ό 수 μžˆλ‹€. 즉, ν•œ 계단을 λ°ŸμœΌλ©΄μ„œ μ΄μ–΄μ„œ λ‹€μŒ κ³„λ‹¨μ΄λ‚˜, λ‹€μŒ λ‹€μŒ κ³„λ‹¨μœΌλ‘œ 였λ₯Ό 수 μžˆλ‹€.
  2. μ—°μ†λœ μ„Έ 개의 계단을 λͺ¨λ‘ λ°Ÿμ•„μ„œλŠ” μ•ˆ λœλ‹€. 단, μ‹œμž‘μ μ€ 계단에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.
  3. λ§ˆμ§€λ§‰ 도착 계단은 λ°˜λ“œμ‹œ λ°Ÿμ•„μ•Ό ν•œλ‹€.

λ”°λΌμ„œ 첫 번째 계단을 밟고 이어 두 번째 κ³„λ‹¨μ΄λ‚˜, μ„Έ 번째 κ³„λ‹¨μœΌλ‘œ 였λ₯Ό 수 μžˆλ‹€. ν•˜μ§€λ§Œ, 첫 번째 계단을 밟고 이어 λ„€ 번째 κ³„λ‹¨μœΌλ‘œ μ˜¬λΌκ°€κ±°λ‚˜, 첫 번째, 두 번째, μ„Έ 번째 계단을 μ—°μ†ν•΄μ„œ λͺ¨λ‘ λ°Ÿμ„ μˆ˜λŠ” μ—†λ‹€.

각 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ μ£Όμ–΄μ§ˆ λ•Œ 이 κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” 총 점수의 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

μž…λ ₯의 첫째 쀄에 κ³„λ‹¨μ˜ κ°œμˆ˜κ°€ 주어진닀.

λ‘˜μ§Έ 쀄뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© 제일 μ•„λž˜μ— 놓인 계단뢀터 μˆœμ„œλŒ€λ‘œ 각 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ 주어진닀. κ³„λ‹¨μ˜ κ°œμˆ˜λŠ” 300μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄κ³ , 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜λŠ” 10,000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 계단 였λ₯΄κΈ° κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” 총 점수의 μ΅œλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1

6
10
20
15
25
10
20

 

예제 좜λ ₯1

75

 

생각

 

ν˜„μž¬ n번째 계단에 μžˆλ‹€κ³  ν•  λ•Œ, μ΅œλŒ€κ°’μ„ κ΅¬ν•œλ‹€κ³  ν•œλ‹€λ©΄ 

 

1) t(n)+t(n-1),

2) t(n)+t(n-2)이닀. 

그런데 λ¬Έμ œμ—μ„œ μ—°μ†ν•΄μ„œ μ„Έ 계단을 밟으면 μ•ˆλœλ‹€κ³  ν•˜μ˜€μœΌλ―€λ‘œ 1)의 κ²½μš°μ—λŠ” t(n)+t(n-1)+t(n-3)이 λ˜μ–΄μ•Όν•œλ‹€. 

1) t(n)+t(n-1)+t(n-3)

2) t(n)+t(n-2)

 

dp[] 배열을 λ‘μ–΄μ„œ n번째 κ³„λ‹¨μ—μ„œμ˜ μ΅œλŒ“κ°’μ„ μ €μž₯ν•œλ‹€.  μ΅œλŒ“κ°’μ„ ꡬ할 λ•ŒλŠ” max 라이브러리λ₯Ό μ΄μš©ν•˜μ˜€λ‹€. 

 

 

β€» 동적 ν”„λ‘œκ·Έλž˜λ°

- μž¬κ·€ ν•¨μˆ˜μ—μ„œ λ™μΌν•œ μž…λ ₯의 ν•¨μˆ˜ 호좜이 반볡적으둜 일어날 λ•Œ κ·Έ κ²°κ³Ό 값을 μ €μž₯ν•΄ 두고 뢈러 μ“°λŠ” 것이닀. 

- 졜초 μž…λ ₯μ—μ„œ νŒŒμƒλ˜λŠ” λͺ¨λ“  κ°€λŠ₯ν•œ μž…λ ₯에 λŒ€ν•œ λͺ¨λ“  값을 μ €μž₯ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬κ°€ μžˆμ–΄μ•Όν•œλ‹€. (ν•΄λ‹Ήλ¬Έμ œμ˜ 경우 dp[])

- λ‹¨μˆœνžˆ μž¬κ·€μ—μ„œ μ €μž₯된 값을 μ°Ύμ•„λ³΄λŠ” 것도 κ°€λŠ₯ν•˜μ§€λ§Œ, κ²°κ³Ό 값을 μˆœμ„œλ₯Ό μ •ν•΄μ„œ 계산할 수 μžˆλ‹€.

- n-1μ—μ„œ 문제λ₯Ό ν’€ 수 있으면 n μ—μ„œλ„ 문제λ₯Ό ν’€ 수 μžˆλ‹€. (μˆ˜ν•™μ  귀납법)

 

μž‘μ„±ν•œ μ½”λ“œ

#include <iostream>
#include <algorithm>

using namespace std;

int n;
int arr[301]; //계단 점수
int dp[301]; //각 κ³„λ‹¨κΉŒμ§€μ˜ μ΅œλŒ€κ°’
int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> n; //κ³„λ‹¨μ˜ 개수
    
    for(int i=0; i<n; i++){
        cin >> arr[i];
    }
    
    dp[0] = arr[0];
    dp[1] = max(arr[0]+arr[1], arr[1]);
    dp[2] = max(arr[0]+arr[2], arr[1]+arr[2]);
    
    for(int i=3; i<n; i++){
        dp[i] = max(arr[i]+dp[i-2], arr[i-1]+arr[i]+dp[i-3]);
    }
    cout << dp[n-1] << "\n";
    
    return 0;
}
λ°˜μ‘ν˜•
Comments