본문 바로가기
Programming/Algorithm

백준 14501 퇴사

by OKOK 2018. 4. 5.

1. dfs 를 들어갈때 문제와 같이, 할 수 있으면? 할 수 있으면, 조건이 들어가야 합니다. 그리고, 건너뛰는 경우도 생각하도록 합니다.


2. 그리고 dfs 의 끝판왕인 리턴문을 어떻게 해주는지 명확하게 합니다.

3. 보통 1로 시작하는 인덱스는 맞춰서 계산하도록 합니다. 그래야 헷갈리지 않습니다.

4. 맵의 형태인데 1로 인덱스 시작하는 것은? 그것은 저는 보통 0으로 합니다. 그리고 인풋을 변경하는 방향을 취합니다.


5. 맵을 인덱스 맞추는 것도 나쁘지 않을 것 같습니다. 그럼 1부터 엔까지 해당 합니다. 오께이. 0 ~ 엔-1 인데

1 에서 엔까지입니다. 그리고 1 이하이면, 엔+1 이상이면 이런식으로 바꿔주면 됩니다. 그리고 엑스 와이가 변경되어서 나오면? 컴퓨터가 흐르는 방향에 맞추는 것이 좋습니다. 컴퓨터는 아래로 엑스 옆으로 와이로 갑니다.  



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
2018.04.05.1037
퇴사문제
N+1 일째 되는 날 퇴사를 하기 위해
예제를 보면,
1일을 해서 날짜에 +3을 하면 4일에 갑니다.
그래서 4일에서 1일을 플러스해서 5일이 됩니다.
그리고 5일에서 +2 를 해서 7일이 됩니다.
7일에서 + 1까지는 되는데 +2 를 하면 9가 되기 때문에 안됩니다. 
*/
 
#include<iostream>
#include<algorithm>
using namespace std;
 
int day[16];
int price[16];
int maxVal;
int N;
 
void problemIn() {
    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> day[i] >> price[i];
    }
}
 
 
 
void dfs(int curD, int sum) {
 
    maxVal = max(maxVal, sum);
 
    if (curD == N + 1) {
        return;
    }
 
    if (curD + day[curD] <= N + 1) { // 일을 함
        dfs(curD + day[curD], sum + price[curD]);
    }
 
    if (curD + 1 <= N + 1) { // 일을 안하고, 다음 날로 감
        dfs(curD + 1, sum);
    }
}
 
 
void solve() {
 
    dfs(10);
 
}
 
int main() {
    problemIn();
    solve();
    cout << maxVal << endl;
    return 0;
}
cs