ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] DP(3) 정수 삼각형
    알고리즘/알고리즘 풀이 2020. 1. 15. 18:08

    문제 풀이

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

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

    제한 사항

     

    • 삼각형의 높이는 1 이상 500 이하입니다.
    • 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.

     

     

    입출력 예

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

     

    풀이

    #include <string>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    int solution(vector<vector<int>> triangle) {
        int answer = 0;
        vector<vector<int>> temp(triangle.size(),vector<int>(triangle.size())); // 벡터 크기 동적 할당
        temp[0][0] = triangle[0][0];
        
        for (int i = 1; i < triangle.size(); i++) {
          for (int j = 0; j <= i; j++) {
    
            // 왼쪽 가장자리일 때 윗 노드 영향만 받음
            if (j == 0)
              temp[i][j] = temp[i - 1][j] + triangle[i][j];
    
            // 오른쪽 가장자리일 때 윗 노드 영향만 받음
            else if (j == i)
              temp[i][j] = temp[i - 1][j - 1] + triangle[i][j];
    
            // 가장자리가 아닌 노드
            else {
              temp[i][j] = max(temp[i - 1][j - 1] + triangle[i][j], temp[i - 1][j] + triangle[i][j]);
            }
    
            // 마지막 줄에서 가장 큰 값 추출
            if (i == triangle.size() - 1)
              answer = max(answer, temp[i][j]);
          }
        }    
        return answer;
    }

     

    dfs로 풀다가 다른 사람의 풀이를 보았다.

    triangle[i][j] 에 triangle[i-1][j-1], triangle[i-1][j] 중의 최댓값을 더해나가는 방식이다.

     

    양 끝 가장자리의 노드는 길이 두 갈레로 나뉘지 않고 바로 밑으로 값이 내려오기 때문에

    if 문으로 예외처리를 해준다.

     

    가운데 노드는 둘 중  max값을 받아 더하도록 한다. 

     

    해당 과정을 트리의 높이까지 했다면 최종 노드에 각 갈레에서의 최댓값을 저장하게 된다.

    그 중 max를 통해 최종 answer를 구한다.

    .

    .

    다시 한번 풀어보도록 하자!

    해당 문제 링크

    https://programmers.co.kr/learn/courses/30/lessons/43105

     

    코딩테스트 연습 - 정수 삼각형 | 프로그래머스

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

    programmers.co.kr

     

    댓글

Designed by black7375.