본문 바로가기

BOJ/Node.js

[BOJ / Node.js] 17390. 이건 꼭 풀어야 해!

728x90

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

 

17390번: 이건 꼭 풀어야 해!

[2, 5, 1, 4, 3]을 비내림차순으로 정렬하면 [1, 2, 3, 4, 5]이다.

www.acmicpc.net

문제

숭실골 높은 언덕 깊은 골짜기에 출제로 고통 받는 욱제가 살고 있다!

욱제는 또 출제를 해야 해서 단단히 화가 났다. 그래서 욱제는 길이 N짜리 수열 A를 만들고, A를 비내림차순으로 정렬해서 수열 B를 만들어 버렸다!! 여기서 B를 출력하기만 하면 문제가 너무 쉬우니까 하나만 더 하자. 아래와 같은 질문이 무려 Q개나 주어진다!! (ㅎㅎ;; ㅈㅅ.. ㅋㅋ!!)

  • L R: BL + BL+1 + ... + BR-1 + BR 을 출력한다.

 

Figure 1. 모든 참가자가 문제를 풀 수 있을 것이라고 기대하는 욱제의 표정

욱제의 질문에 답하고 함께 엠티를 떠나자!!

입력

첫 번째 줄에 수열 A의 길이 N과 질문의 개수 Q가 공백으로 구분되어 주어진다. (1 ≤ N, Q ≤ 300,000)

두 번째 줄에 N개의 정수 A1, A2, ..., AN 이 공백으로 구분되어 주어진다. Ai 는 수열 A의 i 번째 수이다. (1 ≤ Ai ≤ 1,000)

세 번째 줄부터 Q개의 줄에 걸쳐 욱제의 질문을 의미하는 두 수 L, R이 공백으로 구분되어 주어진다. (1 ≤ L ≤ R ≤ N)

주어지는 모든 입력은 자연수이다.

출력

Q개의 줄에 걸쳐, 질문의 답을 순서대로 각각 출력한다.

예제 입력 1 복사

5 6
2 5 1 4 3
1 5
2 4
3 3
1 3
2 5
4 5

예제 출력 1 복사

15
9
3
6
14
9

 

Solve

  • 주어진 배열을 비내림차순으로 정렬하고, 누적합을 저장하기 위해 각 배열에 해당 인덱스까지의 합을 저장했습니다.
  • Q개의 주어진 질문에 대하여 끝 인덱스에서 시작 인덱스의 -1에 해당하는 원소를 뺀다면 부분합을 구할 수 있습니다.

Code

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

const [n, q] = input.shift().split(' ').map(el=>+el);
const a = [0, ...input.shift().split(' ').map(el=>+el)]
const arr = input.map(el=>el.split(' ').map(el=>+el));
const answer = [];
a.sort((a,b)=>a-b);
for(let i = 1 ; i <= n; i++) {
    a[i] = a[i-1] + a[i];
}

arr.forEach((el)=> {
    const [start, end] = el;
    answer.push(a[end] - a[start-1]);
})

console.log(answer.join('\n'))

'BOJ > Node.js' 카테고리의 다른 글

[BOJ / Node.js] 17396. 백도어  (0) 2023.04.25
[BOJ / Node.js] 17141. 연구소2  (0) 2023.04.22
[BOJ / Node.js] 1049. 기타줄  (0) 2023.04.20
[BOJ / Node.js] 12845. 모두의마블  (0) 2023.04.19
[BOJ / Node.js] 16918. 봄버맨  (0) 2023.04.05