코딩테스트

[프로그래머스] 땅따먹기 - Lv.2

pyflu 2024. 1. 19. 18:30

프로그래머스 12913번 문제 "땅따먹기" Lv.2 - 파이썬, 자바

[프로그래머스] 땅따먹기 Lv.2 - [파이썬/python] [자바/java]

 

 

프로그래머스-땅따먹기


💻 문제 설명

 

땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟으면서 내려와야 합니다.

단, 땅따먹기 게임에는 한 행씩 내려올 때, 같은 열을 연속해서 밟을 수 없는 특수 규칙이 있습니다.

 

예를 들면,

| 1 | 2 | 3 | 5 |

| 5 | 6 | 7 | 8 |

| 4 | 3 | 2 | 1 |

로 땅이 주어졌다면, 1행에서 네번째 칸 (5)를 밟았으면, 2행의 네번째 칸 (8)은 밟을 수 없습니다.

 

마지막 행까지 모두 내려왔을 때, 얻을 수 있는 점수의 최대값을 return하는 solution 함수를 완성해 주세요. 위 예의 경우, 1행의 네번째 칸 (5), 2행의 세번째 칸 (7), 3행의 첫번째 칸 (4) 땅을 밟아 16점이 최고점이 되므로 16을 return 하면 됩니다.

 


🚨 제한사항

 

  • 행의 개수 N : 100,000 이하의 자연수
  • 열의 개수는 4개이고, 땅(land)은 2차원 배열로 주어집니다.
  • 점수 : 100 이하의 자연수

 

 




!!!정답 주의!!!




 

 

 


🌟 소스 코드

[Python] 파이썬 코드

프로그래머스-땅따먹기-파이썬-코드

def solution(land):
   
    # DP(동적 프로그래밍) 사용
    # 현재 행의 숫자 4개에
    # 전 행의 숫자를 더했을 때(같은 열 제외)의 값들 중에서
    # 가장 컷을 때의 값을 현재 행에 넣으면서 나아간다.
   
    # 1 ~ 마지막 행 순회(0번째 행보다 이전의 행은 없으니 1행부터 시작한다.)
    for i in range(1, len(land)):
       
        # 행 숫자는 4개
        for j in range(4):
           
            # 현재 행(land[i][j])의 숫자 4개에
            # 같은 행을 제외한 전의 행(land[i-1][j])을 더해가며
            # 최대값이면 현재 행(land[i][j])에 더하기
            land[i][j] += max(land[i-1][:j] + land[i-1][j+1:])
   
    # for문을 통해 순회하면서 차례대로 행의 누적값을 쌓았으니
    # 마지막 행의 최댓값이 답
    return max(land[-1])

 

 

 

[Java] 자바 코드

import java.util.Arrays;

class Solution {
    int solution(int[][] land) {

        // DP(동적 프로그래밍) 사용
        // 현재 행의 숫자 4개에
        // 전 행의 숫자를 더했을 때(같은 열 제외)의 값들 중에서
        // 가장 컷을 때의 값을 현재 행에 넣으면서 나아간다.

        // 1 ~ 마지막 행 순회(0번째 행보다 이전의 행은 없으니 1행부터 시작한다.)
        for(int i=1; i<land.length; i++){

            // 행 숫자는 4개
            for(int j=0; j<4; j++){

                // 현재 행(land[i][j])의 숫자 4개에
                // 같은 행을 제외한 전의 행(land[i-1][j])을 더했을 때
                // 값이 가장 큰 경우를 구하기
                int max = 0;
                for(int k=0; k<4; k++){
                    if ((j != k) && (land[i-1][k] > max)){
                        max = land[i-1][k];
                    }
                }

                // 구한 최대값을 현재 행(land[i][j])에 더하기
                land[i][j] += max;
            }
        }

        // for문을 통해 순회하면서 차례대로 행의 누적값을 쌓았으니
        // 마지막 행의 최댓값이 답
        return Arrays.stream(land[land.length-1]).max().getAsInt();
    }
}

 

 

 


🏳‍🌈 테스트 결과

 

프로그래머스-땅따먹기

 

[Python] 파이썬 - 테스트 결과 [Java] 자바 - 테스트 결과
프로그래머스-땅따먹기-파이썬-테스트-결과
프로그래머스-땅따먹기-자바-테스트-결과
728x90