[프로그래머스] 12942 최적의 행렬 곱셈 - JAVA

2025. 7. 14. 14:26·알고리즘/문제풀이

[프로그래머스] 12942 최적의 행렬 곱셈 - JAVA


문제

https://school.programmers.co.kr/learn/courses/30/lessons/12942

문제 분석

조건

여러 개의 행렬을 순서대로 곱할 때, 곱셈 순서(괄호를 치는 순서)에 따라 총 곱셈 연산 횟수가 달라진다. 주어진 행렬들의 곱셈에 필요한 최소 연산 횟수를 구하는 문제

풀이방법

DP를 이용하여 문제를 풀었다.

`dp[i][j]`는 i번째 행렬부터 j번째 행렬까지 곱하는 데 필요한 최소 곱셈 연산 횟수를 의미한다. 행렬이 1개(`i == j`)일 경우 곱셈이 필요 없으므로 0으로 초기화 한다.

`i`부터 `j`까지의 행렬 곱은, 중간의 한 지점 `k`를 기준으로 (`i ~ k`)까지의 곱과 (`k+1 ~ j`)까지의 곱, 이 두 결과를 마지막으로 곱하는 것과 같다. 점화식은 아래와 같다.

dp[start][end] = Math.min(dp[start][end], 
		dp[start][mid] + dp[mid + 1][end] + 
        (matrix_sizes[start][0] * matrix_sizes[mid][1] * matrix_sizes[end][1]));

코드

class Solution {
    public int solution(int[][] matrix_sizes) {
        int[][] dp = new int[matrix_sizes.length][matrix_sizes.length];
        for (int i = 0; i < matrix_sizes.length; i++) {
            dp[i][i] = 0;
        }
        for (int size = 1; size <= matrix_sizes.length; size++) {
            for (int start = 0; start < matrix_sizes.length; start++) {
                int end = start + size;
                if (end >= matrix_sizes.length) {
                    continue;
                }
                dp[start][end] = (int) 1e9;
                for (int mid = start; mid < end; mid++) {
                    dp[start][end] = Math.min(dp[start][end], dp[start][mid] + dp[mid + 1][end] + (matrix_sizes[start][0] * matrix_sizes[mid][1] * matrix_sizes[end][1]));
                }
            }
        }
        return dp[0][matrix_sizes.length - 1];
    }
}

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'알고리즘/문제풀이' 카테고리의 다른 글
  • [프로그래머스] 62050 지형 이동 - JAVA
  • [백준/BOJ] 2473 세 용액 - JAVA
  • [백준/BOJ] 21610 마법사 상어와 비바라기 - JAVA
  • [프로그래머스] 84021 퍼즐 조각 채우기 - JAVA
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • 바이브코딩 (1)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    pccp모의고사
    알고리즘
    커서ai
    Springsecurity
    BOJ
    LIS
    JWT
    Spring
    느좋코딩
    알고리즘 문제풀이
    프로그래머스
    Java
    LV2
    lv3
    싸피
    그리디
    최장증가부분수열
    너비우선탐색
    BFS
    리액트
    springboot
    백준
    SSAFY 9기
    SSAFY
    Security
    dp
    바이브코딩
    비트마스킹
    ssafy 합격 후기
    dfs
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
LIRI
[프로그래머스] 12942 최적의 행렬 곱셈 - JAVA
상단으로

티스토리툴바