[Programmers] 정수 삼각형

황규빈·2022년 9월 8일
0

알고리즘

목록 보기
32/33

💎 문제


위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.

삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.

💎 입/출력


입출력 예

triangleresult
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]]30

💎 풀이 방법


어렵지 않게 풀 수 있는 DP의 문제였다. Lv3은 아닌 것 같구 2정도의 난이도 였던 DP 문제이다. 문제의 예시 처럼 위에서 아래로 내려오면서 최대가 되는 경우가 언제가 될 수 있을지 고민하는 그리디의 유형인 것 같기도 하다.

일단 위를 기준으로 dp 이차원 배열을 생성하고 triangle과 똑같은 형태로 만들어 준다. 0으로 초기화 해준 뒤 이를 차례대로 내려오면서 위에 값들 중 큰 값들이 담길 수 있도록 계속해서 초기화 해주는 방식이다.

다만, 한 가지 유의할 점은 총 3가지의 경우의 수가 있는 점인데,

  1. 위 층의 삼각형과 비교했을 때 올 수 있는 경우가 오른쪽 위일 때
  2. 위 층의 삼각형과 비교했을 때 올 수 있는 경우가 오른쪽, 왼쪽 위 일 때
  3. 위 층의 삼각형과 비교했을 때 올 수 있는 경우가 왼쪽 위일 때

이 3가지 경우를 고려해서 2번 째의 경우에는 둘 중 큰 값이 내려올 수 있도록 처리해주면 된다.

# 오른쪽 위
if j == 0:
    dp[i][j] = dp[i - 1][j] + length[j]
    
# 왼쪽 위
elif j == len(length) - 1:
    dp[i][j] = dp[i - 1][j - 1] + length[j]
    
# 오른쪽, 왼쪽 위 비교
else:
    dp[i][j] = max(dp[i - 1][j - 1] + length[j], dp[i - 1][j] + length[j])

💎 전체 코드


def solution(triangle):
    dp = [[0 for _ in range(i + 1)] for i in range(len(triangle))]

    dp[0][0] = triangle[0][0]

    for i in range(1, len(triangle)):
        length = triangle[i]
        for j in range(len(length)):
            if j == 0:
                dp[i][j] = dp[i - 1][j] + length[j]
            elif j == len(length) - 1:
                dp[i][j] = dp[i - 1][j - 1] + length[j]
            else:
                dp[i][j] = max(dp[i - 1][j - 1] + length[j], dp[i - 1][j] + length[j])

    return max(dp[len(triangle) - 1])

💎 고민


어렵지 않은 dp 유형인데,,,, 사람들이 풀어 놓은 것 중 한줄로 풀어낸게 있더라,, 굉장한 사람들이 많은게 보였다 ㅠㅠ

하반기 공고가 계속해서 나오고 있는데 이에 대비해서 코딩테스트 준비를 지속적으로 해야할 것 같다. 문제 중에서 특히 그래프와 관련된 문제는 더 익숙해지도록 준비하고, 구현, DP와 같은 문제는 자주 나오기도 하니깐 아이디어를 떠올리는 것에 집중해보자!!

이제 정처기 공부해야지...

화이팅~!

profile
안녕하세욤

0개의 댓글