본문 바로가기
알고리즘

알고리즘 스터디

by COCO1337 2020. 8. 7.

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

문제 설명

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

 

C++를 사용한 제 풀이입니다

#include <string>
#include <vector>
#include <algorithm>

using namespace std;
vector<int> t(1, 0);

int solution(vector<vector<int>> triangle) {
  int n = triangle.size();
  vector<int> dp(n, 0);

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < i + 1; ++j) {
      if (j == n - 1) {
        dp[j] = t[j - 1];
      }
      else if (j == 0) {
        dp[j] = t[j];
      }
      else {
        dp[j] = max(t[j - 1], t[j]);
      }

      dp[j] += triangle[i][j];
    }

    t.assign(dp.begin(), dp.end());
  }

  return *max_element(dp.begin(), dp.end());
}

n층의 양 끝은 비교할 필요없이 전 층의 끝부분을 더해주고

나머지 부분은 n-1층의 n-1번째 까지의 합과 n번째 까지의 합을 비교해서

더 높은 숫자와 n층의 n번째 숫자를 더하는 식으로 풀었어요

시간은 50분 정도 걸렸는데 저번에 동적 프로그래밍 문제를 푼 경험이 있어서 조금 수월했던 것 같네요

 

다른사람이 푼걸 보니까 밑에서부터 푼 사람도 있었네요..

n번째 층부터 시작해서 n-1의 해당 숫자를 더했을 때 둘중에 크기가 작은것은 탈락 하는 식으로 푼 것도 있네요

제 방법대로 하면 비교하고 복사하고 최종적으로 max_element를 사용하게 되는데 n번째 층(최하위층?)부터 시작하면 연산시간을 좀 더 줄일 수 있을 것 같네요

반응형

'알고리즘' 카테고리의 다른 글

알고리즘 스터디  (0) 2021.05.05
알고리즘 스터디  (0) 2021.05.05
알고리즘 스터디  (0) 2020.08.05
알고리즘 스터디  (0) 2020.08.04
알고리즘 스터디  (0) 2020.08.03

댓글