Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        250x250
    
    
  | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
                            Tags
                            
                        
                          
                          - programmers
- 파이썬
- 오블완
- Dynamic Programming
- 티스토리챌린지
- Baekjoon
- Java
- LEVEL 2
- Lv. 2
- Lv. 3
- level 3
- SQL
- javascript
- SQL 고득점 KIT
- 깊이 우선 탐색
- 너비 우선 탐색
- 프로그래머스
- 소프티어
- Lv. 0
- join
- softeer
- DP
- Python
- 백준
- 자바스크립트
- dfs
- bfs
- 동적계획법
- group by
- Lv. 1
                            Archives
                            
                        
                          
                          - Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 3] 최적의 행렬 곱셈 {언어 : JavaScript} [다시 풀어 보기] 본문
728x90
    
    
  문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12942?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답 코드
function solution(matrix_sizes) {
    const n = matrix_sizes.length;
    const dp = Array.from({ length: n }, () => Array(n).fill(Infinity));
    // 대각선은 0으로 초기화 (하나의 행렬은 곱할 필요가 없으므로)
    for (let i = 0; i < n; i++) {
        dp[i][i] = 0;
    }
    // 간격을 1부터 n-1까지 늘려가며 최소 곱셈 횟수를 계산
    for (let length = 1; length < n; length++) {
        for (let i = 0; i < n - length; i++) {
            const j = i + length;
            for (let k = i; k < j; k++) {
                dp[i][j] = Math.min(
                    dp[i][j],
                    dp[i][k] + dp[k + 1][j] + matrix_sizes[i][0] * matrix_sizes[k][1] * matrix_sizes[j][1]
                );
            }
        }
    }
    return dp[0][n-1];
}풀이 방법
- DP 테이블 초기화: dp[i][j]는 i번째 행렬부터 j번째 행렬까지 곱하는 데 필요한 최소 연산 횟수를 나타낸다. dp[i][i]는 0으로 초기화된다.
- 간격에 따른 최소 곱셈 횟수 계산: length는 현재 비교하는 행렬들의 범위다. 이를 증가시키면서 모든 범위에 대해 최소 곱셈 횟수를 계산한다.
- 점화식 사용: dp[i][j]는 dp[i][k] + dp[k + 1][j] + matrix_sizes[i][0] * matrix_sizes[k][1] * matrix_sizes[j][1]의 최소값으로 업데이트된다. 여기서 k는 범위를 분할하는 지점이다.
- 결과 반환: 최종적으로 dp[0][n-1]에는 전체 행렬 곱셈에서 최소 연산 횟수가 저장된다.
느낀점
- dp일거라고 생각은 했지만 계산 방법을 떠올리지 못했다.
- 다시 풀어 보고 방식을 터득하자.
728x90
    
    
  '알고리즘 > 다시 풀어 보기' 카테고리의 다른 글
| 프로그래머스 [Lv. 3] 산 모양 타일링 {언어 : Python} [다시 풀어 보기] (0) | 2024.08.22 | 
|---|---|
| 프로그래머스 [Lv. 3] 코딩 테스트 공부 {언어 : JavaScript} [다시 풀어 보기] [시간 초과 해결] (0) | 2024.08.14 | 
| 프로그래머스 [Lv. 3] 카운트 다운 {언어 : Python} [다시 풀어 보기] [반례] (1) | 2024.08.09 | 
| 프로그래머스 [Lv. 3] 모두 0으로 만들기 {언어 : JavaScript} [다시 풀어 보기] [6, 7, 8, 15, 16, 17번 테스트 케이스] (0) | 2024.08.07 | 
| 백준 GOLD 5 [2504번] 괄호의 값 {언어 : Python} [다시 풀어 보기] (0) | 2024.08.05 | 
