-
[코딩 테스트] 누적합 - 백준 11659 구간 합 구하기 4, 2559 수열, 10986 나머지합알고리즘/코딩 테스트 2023. 1. 27. 14:09
1. 11659 구간 합 구하기 4
수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.const fs = require('fs'); const path = require('path'); const filePath = process.platform === 'linux' ? '/dev/stdin' : path.join(__dirname, '/구간합.txt'); const input = fs.readFileSync(filePath).toString().trim().split('\n'); //N : arr length M: 횟수 const [N,M] = input[0].split(' ').map(v => +v); const arr = input[1].split(' ').map(v => +v); const output = []; // 누적합 배열 const psum = [0]; arr.forEach((_,i)=>{ psum[i+1] = arr[i] + psum[i]; }); function print_psum(start,end) { //start부터 end까지의 합 //즉, 0~end의 합 - 0~start-1까지의 합 return psum[end] - psum[start-1]; } input.slice(2).forEach(ij => { const [i, j] = ij.split(' ').map(v => +v); output.push(psum[j]-psum[i-1]); }); console.log(output.join('\n')); // for (let i =0; i<M;i++) { // let [start,end] = input[i+2].split(' ').map(v=>+v); // console.log(print_psum(start,end)); // }
2. 2559 수열
매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다.
예를 들어, 아래와 같이 10일 간의 온도가 주어졌을 때,
3 -2 -4 -9 0 3 7 13 8 -3
모든 연속적인 이틀간의 온도의 합은 아래와 같다.
이때, 온도의 합이 가장 큰 값은 21이다.
또 다른 예로 위와 같은 온도가 주어졌을 때, 모든 연속적인 5일 간의 온도의 합은 아래와 같으며,
이때, 온도의 합이 가장 큰 값은 31이다.
매일 측정한 온도가 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오.
const fs = require('fs'); const path = require('path'); const filePath = process.platform ==='linux' ? '/dev/stdin' : path.join(__dirname,'/수열.txt'); const input = fs.readFileSync(filePath).toString().trim().split('\n'); //n은 개수, k는 연속적인 날짜 const [n,k] = input[0].split(' ').map(v => parseInt(v)); const arr = input[1].split(' ').map(v=>+v) //누적합 배열 const psum = [0]; arr.forEach((_,i) => psum[i+1] = psum[i]+arr[i]); //k일 간의 온도차 let degree = []; function push_degree(k) { // psum의 마지막 요소는 psum[n] for(let i=0;i+k<=n;i++) { degree.push(psum[i+k] - psum[i]) } } push_degree(k); console.log(Math.max(...degree));
3. 10986 나머지합
수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오.
즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) 쌍의 개수를 구해야 한다.
이 문제는 시간초과로 실패했다.
const fs = require('fs'); const path = require('path'); const filePath = process.platform ==='linux' ? '/dev/stdin' : path.join(__dirname,'/수열.txt'); const input = fs.readFileSync(filePath).toString().trim().split('\n'); //n은 개수, k는 연속적인 날짜 const [n,k] = input[0].split(' ').map(v => parseInt(v)); const arr = input[1].split(' ').map(v=>+v) //누적합 배열 const psum = [0]; arr.forEach((_,i) => psum[i+1] = psum[i]+arr[i]); //k일 간의 온도차 let degree = []; function push_degree(k) { // psum의 마지막 요소는 psum[n] for(let i=0;i+k<=n;i++) { degree.push(psum[i+k] - psum[i]) } } push_degree(k); console.log(Math.max(...degree));
'알고리즘 > 코딩 테스트' 카테고리의 다른 글
[코딩테스트 javascript] 타겟넘버 - DFS , 그래프 탐색 알고리즘 (0) 2023.01.27 [코딩 테스트] 누적합 - 프로그래머스 최솟값 만들기 (0) 2023.01.27 [코딩테스트 javascript] 안전지대 - DFS , BFS, 그래프 탐색 알고리즘 (0) 2023.01.26 [코딩 테스트] 프로그래머스 JS 연습 - 연속된 수의 합, 평행, 최빈값 구하기,겹치는 선분의 길이,옹알이 (0) 2023.01.24 [코딩 테스트] 프로그래머스 JS 연습 - 다음에 올 숫자,특이한 정렬,문자열 밀기,치킨쿠폰,등수 매기기,캐릭터의 좌표 (0) 2023.01.23