[백준] 1563 - 개근상(Java)

2025. 4. 14. 11:38·Algorithm

문제 파악

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

풀이

지각을 두 번 이상 했거나, 결석을 세 번 연속으로 하면 안 된다.
다시 말하면 지각은 모든 일정에서 1번까지만 허용되고, 결석은 연속으로 2회까지만 허용되는 것이다.

허용되는 출결 상태는 6개로 나눌 수 있다.

  1. 지각 총 0회, 결석 누적 0회
  2. 지각 총 0회, 결석 누적 1회
  3. 지각 총 0회, 결석 누적 2회
  4. 지각 총 1회, 결석 누적 0회
  5. 지각 총 1회, 결석 누적 1회
  6. 지각 총 1회, 결석 누적 2회

그렇다면 이전 날의 상태에 출석 / 지각 / 결석 을 수행하면 현재 날까지의 출결 상태를 결정할 수 있겠다.

  1. 지각 총 0회, 결석 누적 0회
    • [지각 총 0회, 결석 누적 0회] (1) + 출석
    • [지각 총 0회, 결석 누적 1회] (2) + 출석
    • [지각 총 0회, 결석 누적 2회] (3) + 출석
  2. 지각 총 0회, 결석 누적 1회
    • [지각 총 0회, 결석 누적 0회] (1) + 결석
  3. 지각 총 0회, 결석 누적 2회
    • [지각 총 0회, 결석 누적 1회] (2) + 결석
  4. 지각 총 1회, 결석 누적 0회
    • [지각 총 0회, 결석 누적 0회] (1) + 지각
    • [지각 총 0회, 결석 누적 1회] (2) + 지각
    • [지각 총 0회, 결석 누적 2회] (3) + 지각
    • [지각 총 1회, 결석 누적 0회] (4) + 출석 (이 부분을 놓쳐서 좀 헤맸다 🙃)
    • [지각 총 0회, 결석 누적 1회] (5) + 지각
    • [지각 총 0회, 결석 누적 2회] (6) + 지각
  5. 지각 총 1회, 결석 누적 1회
    • [지각 총 1회, 결석 누적 0회] (4) + 결석
  6. 지각 총 1회, 결석 누적 2회
    • [지각 총 1회, 결석 누적 1회] (5) + 결석

이를 3차원 DP 배열로 나타내 말일까지 전이하도록 하자.

배열에서 1차원은 날짜, 2차원은 총 지각 횟수, 3차원은 누적 결석 횟수로 설정하였다.
참고로 초기값(DP[0][0][0])은 1로 설정해주도록 한다.

코드

import java.util.Scanner;

public class Main {
    private static final int MOD = 1_000_000;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int day = sc.nextInt();
        sc.close();
        long[][][] dp = new long[day + 1][2][3];
        dp[0][0][0] = 1;
        for (int i = 1; i <= day; i++) {
            // 지각 0
            dp[i][0][0] = (dp[i - 1][0][0] + dp[i - 1][0][1] + dp[i - 1][0][2]) % MOD;
            dp[i][0][1] = dp[i - 1][0][0]; // 결석 1
            dp[i][0][2] = dp[i - 1][0][1]; // 결석 2

            // 지각 1
            dp[i][1][0] = (dp[i - 1][0][0] + dp[i - 1][0][1] + dp[i - 1][0][2] + dp[i - 1][1][0] + dp[i - 1][1][1] + dp[i - 1][1][2]) % MOD;
            dp[i][1][1] = dp[i - 1][1][0]; // 지각 1 + 결석 1
            dp[i][1][2] = dp[i - 1][1][1]; // 지각 1 + 결석 2
        }

        long answer = 0;
        for (long[] d : dp[day]) {
            for (long val : d) {
                answer = (answer + val) % MOD;
            }
        }
        System.out.println(answer);
    }
}

 

저작자표시 비영리 변경금지 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 2132 - 나무 위의 벌레(Java)  (1) 2025.04.17
[백준] 1239 - 차트(Java)  (0) 2025.04.16
[백준] 1379 - 강의실 2 (Java)  (0) 2025.04.09
[백준] 1717 - 집합의 표현 (Java)  (0) 2025.04.08
[백준] 1074 - Z(Java)  (0) 2025.04.04
'Algorithm' 카테고리의 다른 글
  • [백준] 2132 - 나무 위의 벌레(Java)
  • [백준] 1239 - 차트(Java)
  • [백준] 1379 - 강의실 2 (Java)
  • [백준] 1717 - 집합의 표현 (Java)
코드파고
코드파고
  • 코드파고
    Digging Code
    코드파고
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • Memorization (12)
      • Spring (18)
      • Java (1)
      • Algorithm (40)
      • Server (2)
      • DB (0)
      • CS (0)
      • CI & CD (4)
      • Architecture (0)
      • Design Patterns (0)
      • Study (1)
      • Book (9)
        • DEV (7)
        • Non-DEV (0)
      • Infra (1)
        • Kafka (6)
        • AWS (4)
      • TroubleShooting (1)
        • Etc (1)
      • Tools (0)
  • 블로그 메뉴

    • 홈
    • Github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    architecture
    Spring
    Spring독학
    헥사고날아키텍쳐
    클린아키텍쳐
    Spring Boot
    SpringFramework
    알고리즘
    Clean Code
    clean architecture
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
코드파고
[백준] 1563 - 개근상(Java)
상단으로

티스토리툴바