codingtest

17845번 - 수강 과목

2024-05-14
2분 분량
JAVA백준

문제 링크

문제 풀이 시간 : 1시간

문제 요약

  • 첫줄에 최대 공부시간 N, 과목수 K가 주어진다.
  • K개의 줄에 중요도, 필요한 공부시간이 주어진다.
  • 공부 시간의 한계를 초과하지 않으며 과목의 중요도 합이 최대가 되도록 선택해서 수강하자.

문제 풀이

오랜만에 백팩 알고리즘이 생각나서 풀어보았는데

안푼지 꽤 오래 됐더니 간단한 동작 방식만 기억났고

제대로 된 알고리즘 동작 방식이 생각나지 않았다.

결국 다시 블로그를 참조해서 기억을 더듬어 풀 수 있었다.

c++
80 3
650 40
700 60
60 40

위와 같은 입력을 하면 아래와 같은 표가 만들어진다.

post image

정답 코드

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    public static int arr[][], input[][];
    public static int n, k;

    public static void dp() {
        for (int i = 1; i <= k; i++) {
            int time = input[i][1]; //현재 과목의 수강 시간
            int imp = input[i][0];  //현재 과목의 중요도
            for (int j = 1; j <= n; j++) {
                if (j < time) {  //현재 시간이 과목의 수강시간보다 작으면 이전 과목에서의 중요도 복사
                    arr[i][j] = arr[i - 1][j];
                }
                else { //아니면 현재 과목을 수강했을 때 최대 중요도와 수강하지 않았을 때 중요도 비교
                    arr[i][j] = Math.max(arr[i - 1][j], imp + arr[i - 1][j - time]);
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        arr = new int[k + 1][n + 1];
        input = new int[k + 1][2];

        for (int i = 1; i <= k; i++) {
            st = new StringTokenizer(br.readLine());
            input[i][0] = Integer.parseInt(st.nextToken());
            input[i][1] = Integer.parseInt(st.nextToken());
        }
        
        dp();

        System.out.println(arr[k][n]);
    }
}

풀고 보니 코드가 그렇게 어렵지 않았따.

알고리즘 동작 방식만 이해하면 굉장히(?) 쉬운 문제인 것 같다.

함께 읽으면 좋은 글

코딩 테스트2026-04-02

5430번 - AC

함수 R은 배열을 뒤집는 연산 함수 D는 첫 번째 원소를 버리는 연산 단, 배열이 비어 있을 때 D를 수행하면 error 주어진 함수 문자열을 순서대로 수행한 뒤 최종 배열을 출력하는 문제 처음에는 문제 설명 그대로 R이 나올 때마다 배열을 실제로 뒤집고, D가 나오면 맨 앞…

코딩 테스트2026-04-02

1966번 - 프린터 큐

여러 문서가 큐에 들어 있고, 각 문서마다 중요도가 있음 맨 앞 문서를 확인했을 때, 더 높은 중요도의 문서가 뒤에 하나라도 있으면 맨 뒤로 보냄 그렇지 않으면 바로 인쇄 특정 위치의 문서가 몇 번째로 인쇄되는지 구하는 문제 이 문제는 프린터의 동작을 그대로 구현하면 되는…

코딩 테스트2026-03-29

1158 - 요세푸스 문제

1번부터 N번까지 사람이 원형으로 앉아 있음 순서대로 K번째 사람을 제거 모든 사람이 제거될 때까지 반복 제거되는 순서를 출력하는 문제 이 문제는 원형으로 순회하면서 K번째를 제거하는 과정을 그대로 구현하면 된다.

코딩 테스트2026-03-29

2164번 - 카드2

1부터 N까지 카드가 순서대로 쌓여 있음 맨 위 카드를 버리고, 그다음 맨 위 카드를 맨 아래로 옮기는 과정을 반복 마지막에 남는 카드 번호를 구하는 문제 이 문제는 규칙을 찾기보다, 문제에서 하라는 과정을 그대로 구현하면 된다. 카드 더미에서 반복되는 동작은 두 가지다.