프로그래머스_땅따먹기

임정민·2024년 1월 5일
1

알고리즘 문제풀이

목록 보기
139/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 시간초과 (시간초과 케이스 다수 발생)


from collections import deque

def solution(land):
    answer = 0
    
    # 이전 x y 인덱스, 현재 점수
    queue = deque([(0,0,1),(0,1,2),(0,2,3),(0,3,5)])
    length = len(land)

    while queue:
        
        x,y,score = queue.popleft()
        
        if length>x+1:
        
            for idx,value in enumerate(land[x+1]):

                if y!=idx:
                    new = score+value
                    queue.append((x+1,y,new))
                    if new > answer:
                        answer = new

    return answer

입력된 Nx4 배열에서 행을 돌며 연속되지 않은 열의 값들을 더했을 때 최댓값을 구하는 문제입니다.🐨🐨🐨

문제를 이해하고 queue, BFS 구조로 구현해내는 데는 어렵지 않아 해결하는 듯했지만 대부분의 테스트 케이스에서 시간초과가 발생하였고 시간복잡도를 줄이는데 어려움이 있어 다른 풀이를 참고하였습니다.

[다른 사람의 풀이1]


def solution(land):
    n = len(land)

    # dp[i][j] = i행 j열에서 점수의 최대값
    dp = [[0,0,0,0]] + land
    for i in range(1, n+1):
        dp[i][0] += max(dp[i-1][1], dp[i-1][2], dp[i-1][3])
        dp[i][1] += max(dp[i-1][0], dp[i-1][2], dp[i-1][3])
        dp[i][2] += max(dp[i-1][0], dp[i-1][1], dp[i-1][3])
        dp[i][3] += max(dp[i-1][0], dp[i-1][1], dp[i-1][2])

    return max(dp[n])

메모리를 할당하여 시간을 줄이는 DP를 활용하는 것이 포인트였습니다.🐇🐇🐇

각 행을 지날때마다 현재 위치의 열값을 제외한 값들 중의 가장 큰 값을 더한 뒤 저장하며 다음행으로 이동하는 방식입니다.

최대값을 구하는 문제이기 때문에 '나의 풀이'처럼 모든 경우의 수를 탐색하지 않고 max()로 현재 위치에서 가장 큰 값만 찾아 더하고 다음행으로 넘어가는 접근 방식으로 다가가면 되는 문제였습니다.

[다른 사람의 풀이2]


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:]) + land[i][j]

    return max(land[-1])

유사하게 DP으로 해결한 풀이입니다. 각 행의 최대값을 더할때 슬라이싱을 활용하여 조금 더 간결한 표현으로 나타낸것을 볼 수 있었습니다.🐹🐹🐹

감사합니다.

profile
https://github.com/min731

0개의 댓글