본문 바로가기

코테

프로그래머스) 정수삼각형 (js)

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

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


삼각형 위 꼭지점에서 맨 아래로 이어지는 경로 중 거쳐가는 숫자들의 합이 가장 큰 경우를 찾는 문제이다.
내가 제출한 코드는 아래와 같다.

function solution(triangle) {
    let result = 0;
    let arr = triangle.slice(); // (1)
    
    if(arr.length === 1) return arr[0][0]; // (2)
    
    arr[1][0] += arr[0][0];
    arr[1][1] += arr[0][0];
    
    for(let i = 2; i < arr.length; i++){
        for(let j = 0; j < arr.length; j++){
            arr[i][j] = Math.max((arr[i][j] + arr[i-1][j-1]) || 0,
                                (arr[i][j] + arr[i-1][j]) || 0); // (3)
        }
    }
    result = [...arr.pop()].sort((a, b) => b - a)[0]; // (4)
    return result;
}


(1) 입력받은 원본배열을 복사하였다. 더해진 값을 저장하기 위한 배열로 사용하기 위해서이다.
    (사실 slice는 2차배열 이상일 경우 얕은 복사를 수행하기 때문에 제대로된 깊은복사가 아니다)
(2) 꼭지점밖에 존재하지 않는 입려값이 주어지면 그 값을 리턴하게 하였다.
(3) 진행 가능한 경로의 숫자들 중 최댓값을 선택한다. 양 끝지점인 경우 비교할 대상이 없으므로(배열 내 값 undefinded) 0을 넘겨주게 하였다.
(4) 맨 마지막 배열의 값은 각 경로들의 최대값을 갖고 있다. 이 배열을 내림차순으로 정렬한 뒤 맨 처음값을 리턴하면
거쳐가는 숫자들의 합 중 가장 큰 값이 된다.