개발자 톡

연습문제 톡 효도 음식

JS

등록일
2025-02-05 05:25:20
조회수
89
작성자
vavoya6324

풀이 과정 포함 (밑에 주석)


const fs = require('fs');
const input = fs.readFileSync('input.txt', 'utf8').trim().split(/\n+/)[1].split(' ').map(Number);

const array1 = [...input].fill(0)
const array2 = [...input].fill(0)
let first = true
function dp(acc, cur, idx, array) {
    array[idx] = Math.max(acc + (first ? cur : 0), cur)
    return array[idx]
}

// 1,2,3,4 단계
input.reduce((acc, cur, idx) => dp(acc, cur, idx, array1), 0)
input.reverse().reduce((acc, cur, idx) => dp(acc, cur, idx, array2), 0)

// 5 단계
first = false
array1.reduce((acc, cur, idx) => dp(acc, cur, idx, array1), Number.MIN_SAFE_INTEGER)
array2.reduce((acc, cur, idx) => dp(acc, cur, idx, array2), Number.MIN_SAFE_INTEGER)
array2.reverse()

// 6 단계
let answer = Number.MIN_SAFE_INTEGER;
const n = input.length;
for (let i = 0; i < n - 2; i++) {
    answer = Math.max(answer, array1[i] + array2[i+2]);
}
console.log(answer);


/*
배열 순회

1. 배열 읽기 (L -> R)
2. 현재 값을 부분 집합에 추가하는 것 보다 새로 부분집합을 시작하는 것이 값이 더 크면 -> 새로운 부분 집합(요리) 시작
3. 새 배열에 항상 max를 저장
4. 최종적으로 배열에는 각 부분집합들의 L->R 순차적인 합들이 기록됨
5. 이제 특정 index 기준 왼쪽에 있는 값들 중 최대로 다 채우기 ([2]가 4이고 [3]이 2이면 [3]포함 왼쪽에는 4라는 요리의 합이 존재한다는 것을 알려주는 것 DP)
6. 그러면 이제 그냥 배열 순회하면서 i i+2를 합하면서 최대만 찾으면 됨.
 */



오랜만에 알고리즘 해보니 머리가 안돌아가요

#효도_음식
#js

이 카테고리의 톡 더보기