[C++] 백준 14501번: 퇴사

2022. 9. 29. 15:14·problem solving/백준

🔗 문제

14501번: 퇴사

 

14501번: 퇴사

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

www.acmicpc.net

 

🖍 풀이

 

일을 했을 경우와 일을 하지 않았을 경우로 상황을 나눠 생각할 수 있다.

  • i 날에 일을 한 경우: i + T[i] 에 수익이  전에 벌어 놓은 돈 + P[i] 이 된다.
  • i 날에 일을 하지 않을 경우: i+T[i]날 수익에 변동이 없다.
  •  

이걸 재귀함수로 짠다면?

간단하게 생각하면 완전 탐색할 수 있다.

void solve(int days, int profit)
{
    if(days == N+1)
    {
        return;
    }
    
    solve(days + T[days], profit + P[days]);
    solve(days + 1, profit)
}

하지만 재귀함수는 호출된 함수 메모리가 스택에 쌓인다.

메모리를 더 효율적으로 사용하기 위해 동적 프로그래밍의 개념을 도입해 풀 수 있다.

 

i날의 최대 이익을 저정할 DP라는 배열을 생성한다.

일을 했을 때 수익이 발생하는 날은 일이 끝난 다음날이다. 그래서 DP배열을 N+1 크기만큼 생성하고, 반복문도 i≤N로 실행한다.

 

그리고 아까 나눠 본 상황을 코드로 표현한다.

  • i 날에 일을 한 경우: i + T[i] 에 수익이  전에 벌어 놓은 돈 + P[i] 이 된다.
  • i 날에 일을 하지 않을 경우: i+T[i]날 수익에 변동이 없다.
DP[day + T[day]] = std::max( 전에 벌어 놓은 돈 + P[day], DP[day + T[day]]);

 

💾  소스

동적 프로그래밍

#include <iostream>
#include <algorithm>

int N, answer = 0;
int T[100] = {0, };
int P[100] = {0, };
int DP[100] = {0, };
	
int main()
{
	std::cin >> N;
	for(int i=0; i<N; ++i)
		std::cin >> T[i] >> P[i];

	for(int day=0; day<=N; ++day)
	{
		answer = std::max(answer, DP[day]);

		if(T[day] + day <= N)
			DP[day + T[day]] = std::max(answer + P[day], DP[day + T[day]]);
	}

	std::cout << DP[N];

	return 0;
}

완전 탐색ver

#include <iostream>
#include <algorithm>
const int MAX = 1001;
int N, answer = 0;
int T[MAX] = {0, }, P[MAX] = {0, };

void solve(int days, int profit)
{
    if(days == N)
    {
        answer = std::max(answer, profit);
        return;
    }
    
		//days에 배당받은 일 안하고 다음날 일 확인
    solve(days+1, profit);

    if(days+T[days] <= N) // 퇴사일만 넘지 않는다면 일 접수
        solve(days+T[days], profit + P[days]);

}
int main()
{
    std::cin >> N;
    for(int i=0; i<N;++i)
    {
        std::cin >> T[i] >> P[i];
    }

    solve(0, 0);
    std::cout << answer;
    
    return 0;
}

 

저작자표시 비영리 변경금지 (새창열림)
'problem solving/백준' 카테고리의 다른 글
  • [C++] 백준 2580번: 스도쿠
  • [C++] 백준 2339번: 석판 자르기
  • [C++] 백준 1405번: 미친 로봇
  • [C++] 백준 1759번: 암호 만들기
u1qns
u1qns
그냥 알고리즘 풀이만 올리려고 했는데, 정보 찾다보니까 너무 답답해서 이것저것 쓰다보니 커졌어요.
  • u1qns
    블로그
    u1qns
  • 전체
    오늘
    어제
    • 분류 전체보기 (171) N
      • 회고 (1)
      • programming (17)
        • 개념 정리 (6)
        • CI CD (1)
        • 트러블 슈팅 (0)
        • 환경설정 및 팁 (7)
      • problem solving (153) N
        • 개념 정리 (3)
        • 백준 (127) N
        • SWEA (15)
        • 프로그래머스 (4)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    되추적
    boj
    SSAFY
    DFS
    C++
    HELLOSSAFY
    그리디
    완전탐색
    BFS
    POW
    DP
    구현
    미해결
    cpp
    SWEA
    SSAFY수료식
    백준
    투포인터
    삼성청년SW아카데미
    cmath
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
u1qns
[C++] 백준 14501번: 퇴사
상단으로

티스토리툴바