관리 메뉴

코딩 기록 저장소

[프로그래머스/Python] 땅따먹기 본문

프로그래머스/Lv.2

[프로그래머스/Python] 땅따먹기

KimNang 2023. 2. 13. 23:31

문제 정보

제목 : 땅따먹기

난이도 : Lv.2

사용 언어 : Python

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12913

 

문제 설명

땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(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 이하의 자연수

입출력 예

land answer
[[1,2,3,5],[5,6,7,8],[4,3,2,1]] 16

입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.


나의 풀이

첫 시도

처음에는 land에 리스트 [0,0,0,0]을 추가하고 for문을 이용하여 i행에 해당하는 값 중 최댓값을 num에 저장합니다. idx 변수에는 num 값이 저장된 인덱스를 저장합니다. 이후  i+1행 idx열 값이 있는 인덱스의 값을 0으로 변경하고 answer에는 num을 추가합니다. 이렇게 문제를 풀자 테스트케이스는 통과 했으나 채점을 해보니 다 틀렸습니다. 여러 반례를 찾아보던 중 이러한 문제에 마주했습니다.

윗줄에서 최댓값을 골라버려 아랫줄에 최댓값이 있을 때 그 값을 선택하지 못하게 되었습니다.

def solution(land):
    answer = 0
    land.append([0,0,0,0])
    
    for i in range(len(land)-1) :
        num = max(land[i])
        idx = land[i].index(num)
        land[i+1][idx] = 0
        answer += num

    return answer

다른 방식으로 접근을 하게되었습니다. 1부터 land의 길이만큼 반복하는 for문과 4번 반복하는 for문을 생성합니다. land[i][j]의 값에 윗 행의 j열을 제외한 나머지 값중 최댓값을 저장합니다. 반복이 끝나면 land의 마지막 행의 값 중 최댓값을 구하여 answer에 저장 후 리턴합니다.

 

코드

def solution(land):
    answer = 0
    
    for i in range(1,len(land)) :
        for j in range(4) :
            land[i][j] += max( land[i-1][:j] + land[i-1][j+1:] )
    
    answer = max( land[ len(land)-1 ] )
    return answer