[코딩테스트 합격자 되기(Java)] 문제 69. 조약돌 문제★ ★ ★

2025. 1. 5. 11:41·코딩 테스트 정복기/기타
반응형

문제

3열 N행의 가중치가 있는 배열 arr이 주어집니다.

이 배열에 다음 규칙을 준수하면서 조약돌을 놓을 때 최대 가중치의 합을 반환하는 Solution() 함수를 구현하세요.

 

제약조건

• 각 열에 조약돌은 적어도 하나는 놓아야 합니다.
• 각 조약돌에 바로 인접한 위치에 조약돌을 놓을 수 없습니다.

- 인접 기준은 상하좌우입니다.

 

입출력의 예

arr return
[ [ 1, 3, 3, 2 ], [ 2, 1, 4, 1 ], [ 1, 5, 2, 3 ] ] 19
[ [ 2, 7, 13, 2, 6 ], [ 2, -4, 2, 5, 4 ], [ 5, 3, 5, -3, 1 ] ] 32

 

 

 


풀이 및 코드

3열 N행에서 각 열에 조약돌을 놓는 방법은 다음과 같다.

예) 1행에서

1. 1열에 두는 방법
이전 행에서 2열이나 3열을 선택했을 때 가능
두 경우 중 가중치가 더 큰 값 선택
2. 2열에 두는 방법
이전 행에서 1열이나 3열을 선택하거나,
두 열을 동시에 선택했을 때 가능
세 경우 중 가중치가 더 큰 값 선택
3. 3열에 두는 방법
이전 행에서 1열이나 2열 선택했을 때 가능
두 경우 중 가중치가 더 큰 값 선택
4. 1열&3열에 두는 방법
이전 행에서 2열 선택했을 때 가능

 

위를 참고하여 각각 경우를 선택했을 때 가중치합을 dp 배열에 저장한다.

 

 

import java.util.Arrays;

public class Main {
    private static int solution(int[][] arr) {
        // 선택 방법은 네 가지 있음. (1열), (2열), (3열), (1열, 3열)
        int[][] dp = new int[arr[0].length][4]; // (0:1열), (1:2열), (2:3열), (3:1열,3열)
        dp[0][0] = arr[0][0];
        dp[0][1] = arr[1][0];
        dp[0][2] = arr[2][0];
        dp[0][3] = arr[0][0] + arr[2][0];

        for(int i = 1; i < arr[0].length; i++) {
            dp[i][0] = Math.max(dp[i-1][1], dp[i-1][2]) + arr[0][i]; // 1열 선택 -> 전 행에서 2열이나 3열 선택
            dp[i][1] = Math.max(Math.max(dp[i-1][0], dp[i-1][2]), dp[i-1][3]) + arr[1][i]; // 2열 선택 -> 전 행에서 1열이나 3열 선택
            dp[i][2] = Math.max(dp[i-1][0], dp[i-1][1]) + arr[2][i]; // 3열 선택 -> 전 행에서 1열이나 2열 선택
            dp[i][3] = dp[i-1][1] + arr[0][i] + arr[2][i]; // 1,3열 선택 -> 전 행에서 2열 선택
        }
        return Arrays.stream(dp[dp.length-1]).max().getAsInt();
    }

    public static void main(String[] args) {
        System.out.println(solution(new int[][] {{1, 3, 3, 2}, {2, 1, 4, 1}, {1, 5, 2, 3 }})); // 19
        System.out.println(solution(new int[][] {{1, 7, 13, 2, 6}, {2, -4, 2, 5, 4}, {5, 3, 5, -3, 1}})); // 32
    }
}

 

728x90
반응형

'코딩 테스트 정복기 > 기타' 카테고리의 다른 글

[코딩테스트 합격자 되기(Java)] 문제 68. LIS길이계산하기★ ★ ★  (0) 2025.01.03
[코딩테스트 합격자 되기(Java)] 문제 51. 정렬이 완료된 두 배열 합치기★  (2) 2024.12.10
[코딩테스트 합격자 되기(Java)] 문제 50. 계수정렬 구현하기★  (0) 2024.12.09
[코딩테스트 합격자 되기(Java)] 문제 44.스도쿠 퍼즐★★★  (0) 2024.11.28
[코딩테스트 합격자 되기(Java)] 문제 43.1부터 N까지 숫자 중 합이 10이 되는 조합 구하기★  (0) 2024.11.27
'코딩 테스트 정복기/기타' 카테고리의 다른 글
  • [코딩테스트 합격자 되기(Java)] 문제 68. LIS길이계산하기★ ★ ★
  • [코딩테스트 합격자 되기(Java)] 문제 51. 정렬이 완료된 두 배열 합치기★
  • [코딩테스트 합격자 되기(Java)] 문제 50. 계수정렬 구현하기★
  • [코딩테스트 합격자 되기(Java)] 문제 44.스도쿠 퍼즐★★★
settong
settong
    250x250
  • settong
    개 발 자 국
    settong
  • 전체
    오늘
    어제
    • 전체보기 (202)
      • Computer Science (50)
        • Network (7)
        • Operating System (18)
        • Data Structure (9)
        • Database (11)
        • Algorithm (5)
      • Language (17)
        • Java (17)
        • Javascript (0)
        • Python (0)
      • Devops (20)
        • AWS (0)
        • Naver Cloud (16)
        • CICD (3)
        • 웹 서버 관리 (1)
      • Front (0)
        • React (0)
      • Backend (5)
        • Spring (5)
      • 코딩 테스트 정복기 (110)
        • 백준 (51)
        • 프로그래머스 (53)
        • 기타 (6)
      • etc (0)
      • 경제 상식 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다이나믹프로그래밍
    프로그래머스
    lcs
    집합
    벨만포드
    완전탐색
    ncp
    Spring Boot
    Network
    github actions
    해시
    CI/CD
    DFS
    ncp200
    BFS
    분할정복
    다익스트라
    ncp202
    백트래킹
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
settong
[코딩테스트 합격자 되기(Java)] 문제 69. 조약돌 문제★ ★ ★
상단으로

티스토리툴바