본문 바로가기
Engineering WIKI/Programmers

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

by wonos 2022. 5. 26.
 

코딩테스트 연습 - 땅따먹기

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

programmers.co.kr

내 풀이 1차시도 실패

def solution(land_list):
    answer = 0
    index = -1
    
    for land in land_list:
        if index != land.index(max(land)):
            answer += max(land)        
        else:
            land.remove(max(land))
            answer += max(land)
        
        index = land.index(max(land))

    return answer
  • DP를 이용하는 문제이다.
  • 맨 위에 행은 냅둬도 되어서 1부터 시작한다.
  • 자신의 열은 제외하고 가장 큰 값을 구한다.

다른 사람 풀이

def solution(land):

    for i in range(1,len(land)):
        for j in range(len(land[0])):
            land[i][j] += max(land[i-1][:j] + land[i-1][j+1:])

    return max(land[len(land)-1])

코드는 land[i][j] + 그 위에 줄의 j열 빼고 만든 리스트에서 max값을 뽑아서 더해주라는 뜻이다. land[i-1][:j]를 하면 j열 앞까지 리스트가 뽑히고 land[i-1][j+1:]을 하면 j+1열부터 끝까지 리스트가 뽑혀서 리스트 끼리 더하면 합쳐진 리스트가 된다. 그 리스트에서 max 값을 더해주라는 뜻이다!!

다른 사람 풀이 2

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