* [프로그래머스] 땅따먹기 - JavaScript

이은빈 EUNBIN·2021년 5월 7일
0
post-thumbnail

📌 문제

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



📌 풀이

// 1차 시도 실패 (테케만 통과)
function solution(land) {
    let answer = [];
    let max = 0;
    let index = -1;
    
    for(let i = 0; i < land.length; i++) {
        for(let j = 0; j < 4; j++) {
            if(index !== j) {
                max < land[i][j] ? max = land[i][j] : max;
            }
        }
        index = land[i].indexOf(max);
        answer.push(max);
        max = 0;
    }
    
    return answer.reduce((acc,cur) => acc + cur);
}
// 2차 시도 실패.. (테케만 통과)
function solution(land) {
    let answer = [];
    let max = Math.max(...land[0]);
    let index = land[0].indexOf(max);
    
    for(let i = 0; i < land.length; i++) {
        if(i === 0) {
            answer.push(max);
        } else {
            land[i][index] = 0;
            max = Math.max(...land[i]);
            index = land[i].indexOf(max);
            answer.push(max);
        }
    }
    return answer.reduce((acc,cur) => acc + cur);
}

인덱스가 겹치지 않게 큰 값만 더하면 된다고 생각했는데
완전 잘못 접근하고 있었다 😭


// 다른 분의 풀이 (1)
function solution(land) {
    let answer = 0;
    
    for(let i = 0; i < land.length; i++){
       for(let j = 0; j < 4; j++){
           if(i === 0){
               continue;
           } else {
               let arr = land[i-1].slice();
               arr[j] = 0;
               land[i][j] += Math.max.apply(null, arr);
               answer = Math.max(land[i][j], answer);
           }
       }       
    }
    
    return answer;
}

동적 계획법이라는 자료구조로 접근해야 하구나 (...)
이 분 풀이를 보니 왜 이전 배열의 원소들과 하나씩 더한 것으로 비교하여
접근해야 하는지 알 수 있었다...!

처음엔 이해 하나도 안갔는데 console 찍어보면서 어떻게 계산되는건지 보니까
정말 어메이징 그 자체,,,,👏🏻👏🏻


// 다른 분의 풀이 (2)
function solution(land) {
    var answer = 0;

    return Math.max(...land.reduce((a, c) => {
        return [
            c[0] + Math.max(a[1], a[2], a[3]),  
            c[1] + Math.max(a[0], a[2], a[3]),
            c[2] + Math.max(a[0], a[1], a[3]),
            c[3] + Math.max(a[0], a[1], a[2]),
        ];
    }, [0, 0, 0, 0]));
}

와.. 리듀스로..
문제에선 4행이지만 4행보다 더 클 경우를 대비해서
(1) 풀이 잘 봐나야지 📝

profile
Frontend Engineer & Value Creator

0개의 댓글