-
[프로그래머스] - 땅따먹기Algorithm/프로그래머스 2022. 7. 29. 06:02
문제
땅따먹기
https://school.programmers.co.kr/learn/courses/30/lessons/12913#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 이해
더보기문제 설명
땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(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 이하의 자연수
즉, 모든 칸을 내려오면서 낼 수 있는 최대 칸 수를 구하는 겁니다.
Column의 길이는 4인점도 참고합니다.
알고리즘
맨 마지막 칸에서 100이 주어진다면, 앞에서 해당 값보다 적었으면 무조건 100을 포함한 계산 값이어야 합니다.
따라서 해당 문제는 DP로 풀어야 합니다.
각 자신의 순서(i)에서 전 순서(i-1)에 대해 본인이 현재 위치하고 있지 않는 값 중 최대값+현재 본인의 위치의 값
코드
# Programmers - 땅따먹기 def solution(land): answer = 0 n = len(land) dp = [[0]*4 for _ in range(n)] dp[0] = land[0] for i in range(1,n): for j in range(4): dp[i][j] = max(dp[i-1][:j]+dp[i-1][j+1:])+land[i][j] return max(dp[-1])
코드 리뷰
- DP로 하여 구하였으나, 사실 dp라는 variable을 선언할 필요가 없었다..
- 기존에 있는 것을 사용해도 무방하였다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 행렬의 곱셈 (0) 2022.08.04 [프로그래머스] - 숫자 블록 (0) 2022.07.29 [프로그래머스] - [3차] n진수 게임 (0) 2022.07.20 [프로그래머스] - [3차] 파일명 정렬 (0) 2022.07.20 [프로그래머스] - 최댓값과 최솟값 (0) 2022.07.19