백준[node.js] > 11660번 구간 합 구하기5

2024. 11. 14. 21:04·🔒Algorithm

 

문제링크

https://www.acmicpc.net/problem/11660

 

문제풀이

이 문제는 언뜻보면 쉬어보인다. 하지만 단순하게 풀면 연산횟수가 너무 많아 시간초과가 난다. 

연산횟수를 확인히 줄이기 위해 dp(동적계획법-dynamic programming)를 이용해야 한다. 

dp를 생각하는 순간 문제는 쉬어진다.

let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

let [tableInfo, ...arr] = input;

let [N, M] = tableInfo.split(" ").map((num) => Number(num));

let table = [];
for (let i = 0; i < N; ++i) {
    table.push(arr[i].split(" ").map((num) => Number(num)));
}

let dp = Array.from({ length: N }, () => {
    return Array(N).fill(0);
});

for (let row = 0; row < N; ++row) {
    for (let col = 0; col < N; ++col) {
        if (row === 0 && col === 0) {
            dp[0][0] = table[0][0];
            continue;
        }

        if (col === 0) {
            dp[row][col] = dp[row - 1][col] + table[row][col];
            continue;
        }

        if (row === 0) {
            dp[row][col] = dp[row][col - 1] + table[row][col];
            continue;
        }

        dp[row][col] = dp[row - 1][col] + dp[row][col - 1] - dp[row - 1][col - 1] + table[row][col];
    }
}

for (let i = N; i < arr.length; ++i) {
    let [r1, c1, r2, c2] = arr[i].split(" ").map((num) => Number(num));

    let sum = dp[r2 - 1][c2 - 1];

    if (r1 - 2 >= 0) {
        sum -= dp[r1 - 2][c2 - 1];
    }

    if (c1 - 2 >= 0) {
        sum -= dp[r2 - 1][c1 - 2];
    }

    if (r1 - 2 >= 0 && c1 - 2 >= 0) {
        sum += dp[r1 - 2][c1 - 2];
    }

    console.log(sum);
}

'🔒Algorithm' 카테고리의 다른 글

백준 [nodejs] > 1629번 곱셈  (0) 2024.11.17
백준 [node.js] > 1916번 최소 비용 구하기  (1) 2024.11.16
백준[nodejs] > 9465번 스티커  (1) 2024.11.13
백준[node.js] > 1181번 단어 정렬  (0) 2024.11.12
백준[node.js] > 1149 RGB거리  (0) 2024.11.11
'🔒Algorithm' 카테고리의 다른 글
  • 백준 [nodejs] > 1629번 곱셈
  • 백준 [node.js] > 1916번 최소 비용 구하기
  • 백준[nodejs] > 9465번 스티커
  • 백준[node.js] > 1181번 단어 정렬
devWarrior
devWarrior
  • devWarrior
    devWarrior
    devWarrior
  • 전체
    오늘
    어제
    • 🧩Dev (263)
      • ⭐FE (34)
      • 🔒Algorithm (155)
      • ➕Etc. (11)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    js
    leetcode
    FE
    백준
    실버1
    Easy
    프로그래머스
    구현
    코딩테스트
    실버2
    dp
    실버3
    react
    코테
    javascript
    실버4
    DFS
    티스토리챌린지
    그리디
    Lv2
    골드5
    Algorithm
    오블완
    nodejs
    자스
    node.js
    BFS
    자바스크립트
    알고리즘
    프론트엔드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
devWarrior
백준[node.js] > 11660번 구간 합 구하기5
상단으로

티스토리툴바