728x90
프로그래머스 Lv.2
땅따먹기
문제 설명
땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(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 이하의 자연수
나의 문제 풀이 코드 (0/100)
오답 풀이 코드
class Solution {
static int solution(int[][] land) {
int[][] dp = new int[land.length][4];
// 첫 번째 행은 초기값으로 설정
for (int i = 0; i < 4; i++) {
dp[0][i] = land[0][i];
}
for (int i = 1; i < land.length; i++) {
for (int j = 0; j < 4; j++) {
// 이전 행에서 j 열을 제외한 나머지 열 중 최댓값을 찾아 현재 행의 j 열에 더함
dp[i][j] = land[i][j] + findMax(dp[i - 1], j);
}
}
// 마지막 행의 최댓값을 반환
return findMax(dp[land.length - 1], -1);
}
// 이전 행에서 j 열을 제외한 나머지 열 중 최댓값 찾기
static int findMax(int[] arr, int excludeIndex) {
int max = 0;
for (int i = 0; i < 4; i++) {
if (i != excludeIndex && arr[i] > max) {
max = arr[i];
}
}
return max;
}
}
문제 풀이 코멘트
1. dp 배열 초기화:
- dp 배열은 2차원 배열로, dp[i][j]는 i번째 행에서 j열을 선택했을 때 얻을 수 있는 최대 점수를 나타냅니다.
- 첫 번째 행은 주어진 땅의 첫 번째 행과 동일한 값으로 초기화합니다. 이는 시작점에서부터 각 열을 선택한 경우의 점수를 나타내는 것입니다.
2. 반복문을 통한 DP 계산:
- 두 번째 행부터 마지막 행까지 반복하면서 각 행의 각 열에 대해 최대 점수를 계산합니다.
- 현재 행의 각 열에 대해서, 이전 행에서 해당 열을 제외한 나머지 열 중에서 최댓값을 찾아 현재 행의 해당 열에 현재 행의 값과 더한 값을 저장합니다. 이를 통해 이전 행까지의 최적의 선택을 반영하면서 현재 행의 최대 점수를 계산합니다.
3. findMax 함수:
- 이전 행에서 j 열을 제외한 나머지 열 중 최댓값을 찾는 함수입니다.
- excludeIndex를 통해 제외할 열을 지정합니다.
- 반복문을 통해 나머지 열 중에서 최댓값을 찾아 반환합니다.
4. 마지막 행의 최댓값 반환:
- 위의 과정을 마치면 dp 배열의 마지막 행에는 각 열에 대한 최대 점수가 계산되어 있습니다.
- 이 중에서 최댓값을 반환합니다.
이 코드는 DP 배열을 활용하여 이전 행의 최적의 선택을 저장하고, 현재 행에서 최대 점수를 계산하여 문제를 해결하는 방식입니다. DP를 활용함으로써 각 단계에서 중복되는 계산을 최소화하면서 효율적으로 최대 점수를 계산할 수 있습니다.
728x90
'공log > [P&B]' 카테고리의 다른 글
[P&B] #41 BAEKJOON 2588 (0) | 2023.09.16 |
---|---|
[P&B] #40 Programmers (0) | 2023.08.27 |
[P&B] #38 PreCodingTest (0) | 2023.08.25 |
[P&B] #37 PreCodingTest (0) | 2023.08.24 |
[P&B] #36 PreCodingTest (0) | 2023.08.23 |