[DFS] 14501 퇴사 C++

Seunghyeon·2023년 1월 18일

백준 문제 푼다.

목록 보기
5/21

해결 코드

#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> v;

int visited[15] = { 0, };
int sum = 0;
int cur;
int n;

void dfs(int cnt, int cur)
{
	// cnt가 n 이 되면 중단 후 최대값 비교
	if (cnt == n)
	{
		sum = max(sum, cur);
		return;
	}

	// 하면 더하고
	if (visited[cnt] != 1 && v[cnt][0] <= n - cnt)
	{
		for (int i = cnt; i < cnt + v[cnt][0]; i++)
		{
			visited[i] = 1;
		}

		dfs(cnt + 1, cur + v[cnt][1]);

		for (int i = cnt; i < cnt + v[cnt][0]; i++)
		{
			visited[i] = 0;
		}
	}

	// 안하면 안더하고
	dfs(cnt + 1, cur);

}

int main()
{
	// 모든 경우를 해봐야 하기 때문에 dfs로 구성함.
	// visited 를 통해 일을 한 기간만큼 visited를 체크해서 방문하지 않도록 함.
	
	cin >> n;
	
	for (int i = 0; i < n; i++)
	{
		int temp;
		vector<int> t;
		cin >> temp;
		v.push_back(t);
		v[i].push_back(temp);
		cin >> temp;
		v[i].push_back(temp);
	}

	dfs(0, 0);

	cout << sum;

	return 0;
}

풀이 방법

간단하게 생각해서

  1. 당일 일을 하는 경우
  2. 당일 일을 안하는 경우

로 나눠서 접근해봤다.

일을 한다면 일을 할 때 소요되는 시간은 visited 배열로 체크를 해준다.

  1. 당일 일을 하는 경우
    1.내가 전날의 일을 하는중이 아니고 ( visited 가 0이고 )
    2.일을 하는데 걸리는 시간이 퇴사 전에 끝 낼 수 있으면
    일을 할 수 있다.
  1. 당일 일을 안 하는 경우
    아무것도 안하고 다음날로 넘어간다.

처음에는 걸리는 시간과 퇴사의 관계를 생각하지 않았고
for문으로 모든 일을 다 돌아야 된다는 강박에 좀 걸렸지만

단순하게 생각해보면 쉽게 넘어가는 문제이다.

DP로도 해결할 수 있는 방법이 있어서 그 방법도 해보겠다.

profile
그냥 합니다.

0개의 댓글