티스토리 뷰

알고리즘/브루트포스

C++ 14501 퇴사

신입사원 성장기 2023. 7. 29. 17:37

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

풀 때마다 어려운 점이 생기는 문제이다.

이번에는 경계 처리가 헷갈려서 시간이 오래 걸렸다. 처음에는 DP로 풀었지만 이번에는 완전탐색으로 풀었다. 

 

풀이

1. 모든 가능한 경우의 수를 탐색한다.

예를 들어 1일을 상담한다면 그 뒤로는 가능한 경우는 4일, 5일, 6일과 7일이 있고, 각각을 상담 가능한지 확인한다.

만약 1일과 4일을 상담한다면, 그 다음 가능한 경우는 (1일, 4일, 5일), (1일, 4일 6일), (1일, 4일, 7일)을 문제의 조건과 비교하여 (1일, 4일, 5일)만 상담이 가능한 것을 알 수 있다.

이러한 방식으로 모든 경우의 수를 탐색한다. 

 

2. 각각의 경우에서 최대 금액을 구한다.

 

코드

#include <bits/stdc++.h>
using namespace std;
int n;
int t[16];
int p[16];
vector<int> days;
int ans;

void dfs(int st) {
    if(st > n+1) { // 새로운 시작점이 n+1보다 크면 범위를 벗어남
        return;
    }

    int tmp = 0;
    for (const auto &day: days) { // 지금까지 추가된 날의 페이를 더함
        tmp += p[day];
    }
    ans = max(ans, tmp);

    for(int i=st; i<=n; i++) {
        days.push_back(i);
        dfs(i+t[i]); // 다음 가능한 일자로 넘어감
        days.pop_back();
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for(int i=1; i<=n; i++)  cin >> t[i] >> p[i];

    dfs(1);
    cout << ans;
}

처음에 종료 조건 if문 안에서 비용을 구하고 최대값을 갱신하는 방식으로 풀이했으나, 계속 예외 케이스가 생겼다. 

 

풀이를 찾아보니 굳이 if문 안에서 최대값을 갱신해줄 필요가 없다는 것을 알게되어 밖으로 빼주었다.

st >= n+1이 아니라 st > n+1인 이유는 아래 케이스를 분석해보면 알 수 있다. 결론은 st >= n+1로 하면 마지막 10을 더해주지 못한다.

10
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10

'알고리즘 > 브루트포스' 카테고리의 다른 글

[Softeer] 7회 기출 순서대로 방문하기 Java  (0) 2024.09.04
C++ 1248 Guess  (0) 2023.07.31
C++ 10972 다음 순열  (0) 2023.07.29
C++ 1748 수 이어 쓰기 1  (0) 2023.07.27
C++ 14500 테트로미노  (0) 2023.07.24
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday