[백준] 1301 - 비즈 공예(Java)

2025. 4. 21. 19:11·Algorithm

문제 파악

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

풀이

모든 상태를 해시맵에 담는 방법으로 풀이했더니, OOM이 발생했다 😇

N의 범위 [3,5]가 상당히 한정적이므로  다차원 배열을 선언해 상태를 저장하기로 결정했다.
(참고로 최대 개수인 5로 고정해 연산을 진행하였다.)
또 3개가 연속하면 안 되는 제약조건 때문에 [마지막에서 두 번째 구슬 종류][마지막 구슬 종류]도 DP 배열에 반영해야 한다.

그러므로 DP 배열은
[1번째 구슬 개수][2..][3..][4..][5번째 구슬 개수][마지막에서 두 번째 구슬 종류][마지막 구슬 종류]
로 7차원 배열을 가진다.

DP 배열만 잘 선언해주면, 나머지는 풀이가 그렇게 어렵지는 않다.

이미 계산한 상태(문제)의 결과를 저장해 두고, 같은 계산을 다시 하지 않도록 하는 기법인 DP의 기조에 근거하여

  • 값이 있다면 리턴
  • 값이 없다면 다음 참고 값을 연산하거나 불러 와 합산해 리턴

을 진행하도록 하자.

이를 코드에 녹여내면 다음과 같다.

코드

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

public class Main {
    static int beadColorCount;
    static int[] beadArr;
    static long[][][][][][][] dp;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        beadColorCount = Integer.parseInt(br.readLine()); // [3,5]
        beadArr = new int[5];
        for (int b = 0; b < beadColorCount; b++) {
            int count = Integer.parseInt(br.readLine());
            beadArr[b] = count;
        }
        int MAX = 12; // 각 구슬 수가 최대 12
        dp = new long[MAX][MAX][MAX][MAX][MAX][6][6];
        for (int a = 0; a < MAX; a++)
            for (int b = 0; b < MAX; b++)
                for (int c = 0; c < MAX; c++)
                    for (int d = 0; d < MAX; d++)
                        for (int e = 0; e < MAX; e++)
                            for (int l = 0; l < 6; l++)
                                for (int cnt = 0; cnt < 6; cnt++)
                                    dp[a][b][c][d][e][l][cnt] = -1;
        System.out.println(dfs(5, 5)); // 존재하지 않는 5번째 구슬로 호출
    }

	// last1 = 마지막 구슬의 종류, last2 = 마지막에서 두 번째 구슬의 종류
    static long dfs(int last1, int last2) {
        if (Arrays.stream(beadArr).sum() == 0L) return 1;
        long status = dp[beadArr[0]][beadArr[1]][beadArr[2]][beadArr[3]][beadArr[4]][last1][last2];
        if (status != -1)
            return status;
        long res = 0;
        for (int i = 0; i < beadColorCount; i++) {
            if (beadArr[i] == 0 || i == last1 || i == last2) continue;
            beadArr[i]--;
            res += dfs(i, last1);
            beadArr[i]++;
        }
        dp[beadArr[0]][beadArr[1]][beadArr[2]][beadArr[3]][beadArr[4]][last1][last2] = res;
        return res;
    }
}

 

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

'Algorithm' 카테고리의 다른 글

[백준] 1174 - 줄어드는 수(Java)  (1) 2025.05.08
[백준] 12970 - AB (Java)  (0) 2025.04.28
[백준] 1039 - 교환(Java)  (1) 2025.04.18
[백준] 2132 - 나무 위의 벌레(Java)  (1) 2025.04.17
[백준] 1239 - 차트(Java)  (0) 2025.04.16
'Algorithm' 카테고리의 다른 글
  • [백준] 1174 - 줄어드는 수(Java)
  • [백준] 12970 - AB (Java)
  • [백준] 1039 - 교환(Java)
  • [백준] 2132 - 나무 위의 벌레(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
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
코드파고
[백준] 1301 - 비즈 공예(Java)
상단으로

티스토리툴바