본문 바로가기
백준

[백준] 1535번 : 안녕 – JAVA [자바]

by Hongwoo 2022. 4. 13.
반응형

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

 

1535번: 안녕

첫째 줄에 사람의 수 N(≤ 20)이 들어온다. 둘째 줄에는 각각의 사람에게 인사를 할 때, 잃는 체력이 1번 사람부터 순서대로 들어오고, 셋째 줄에는 각각의 사람에게 인사를 할 때, 얻는 기쁨이 1번

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 1535번 안녕은 DP, 그중에서도 배낭 문제와 되게 유사한 문제이다. 배낭 문제를 아직 잘 모르면 밑에 있는 링크를 참고하면 되겠다.

 

https://propercoding.tistory.com/50

 

[알고리즘] 배낭 문제 (Knapsack Problem)

목차 배낭 문제란? 배낭 문제란 담을 수 있는 최대 무게가 정해진 배낭이 있고 각각의 무게와 가치가 주어진 물건들이 주어졌을 때, 배낭에 담은 물건들의 가치가 최대가 되도록 하게 물건을 고

propercoding.tistory.com

 

보통 배낭 문제에서는 물건의 개수 n이 있고, 배낭의 무게 제한 k가 있다. 그리고 물건들의 무게들인 배열 w가 있고 이 물건들의 가치인 배열 v가 있다. 이번 문제도 똑같다.

 

물건의 개수 대신 사람 n명이 있고 무게 제한 대신 체력이 있다. 단, 여기서 최대 체력이 문제에서 100이라고 주어져서 100이라고 생각을 할 수도 있는데 실은 99이다. 왜냐하면 체력이 0이 되거나 음수가 되면 세준이가 죽어서 기쁨을 못 느낀다고 문제에 나와있기 때문이다. 그리고 다른 배낭 문제들과 같게 입력에서 각 사람을 만날 때마다 소요하는 체력들이 주어지고 그 사람들을 만날 때 얻는 기쁨들이 주어진다. 이 점만 참고하면 배낭 문제와 똑같기 때문에 쉽게 해결할 수 있을 것이다.

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int k = 99;
        int[][] dp = new int[n+1][k+1];
        int[] w = new int[n+1];
        int[] v = new int[n+1];
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringTokenizer st2 = new StringTokenizer(br.readLine());
        for (int i = 1; i <= n; i++) {
            w[i] = Integer.parseInt(st.nextToken());
            v[i] = Integer.parseInt(st2.nextToken());
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= k; j++) {
                if (w[i] <= j) {
                    dp[i][j] = Math.max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]);
                } else {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        System.out.print(dp[n][k]);
    }
}

 


  • 후기

이 문제는 배낭 문제 코드에서 살짝만 변형하면 풀 수 있는 문제였다.

 

반응형

댓글