250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 항해99
- next js
- 코어자바스크립트
- 리액트 메모
- 실행컨텍스트
- 리액트
- JS module system
- 렌더링 최적화
- 테스트 코드 툴 비교
- 리액트 렌더링 최적화
- chromatic error
- toggle-btn
- this
- Js module
- gql restapi 차이
- 알고리즘
- js배열 알고리즘
- FP 특징
- 웹팩 기본개념
- 항해99 부트캠프
- 함수형 프로그래밍 특징
- 항해99 미니프로젝트
- 리액트 메모이제이션
- 자바스크립트 엔진 v8
- 항해99 사전스터디
- jwt
- 타입스크립트
- v8 원리
- 리덕스
- 웹 크롤링
Archives
- Today
- Total
Jaeilit
백준 구간 합 구하기 4 11659 js 본문
728x90
https://www.acmicpc.net/problem/11659
로직 설명
입력
5 3
5 4 3 2 1
1 3
2 4
5 5
첫째줄 5 길이의 배열 중에
더해야하는 인덱싱 번호가 3개 주어진다.
5 4 3 2 1 중에
1 3 번째를 다 더해주면 5 4 3 이라서 12
2 4 는 4 3 2 를 더해줘서 9
5 5는 1 이기때문에 1이다.
답은 12 9 1
틀린 내 코드
const fs = require("fs");
const filePath =
process.platform === "linux" ? "/dev/stdin" : "./준/누적합/11659/input.txt";
const input = fs.readFileSync(filePath).toString().trim().split("\n");
const [n, m] = input.shift().split(" ");
const arr = input.shift().split(" ").map(Number);
input.forEach((e) => {
const [start, end] = e.split(" ");
let left = start - 1;
let sum = 0;
for (let i = left; i < arr.length; i++) {
if (end <= i) {
break;
}
console.log(arr[left], start, end, i);
// 5 1 3 0
// 4 1 3 1
// 3 1 3 2
// 12
// 4 2 4 1
// 3 2 4 2
// 2 2 4 3
// 9
// 1 5 5 4
// 1
sum += arr[left];
left++;
}
console.log(sum, "\n");
});
입력을 forEach 로 돌리면서 start, end 로 나눠주고
인덱싱은 0부터인데 start 는 1부터 시작하기 때문에 left 라는 변수에 start-1 을 할당하고
for문으로 i는 더해야하는 첫번째 인덱스부터 돌아준다.
1 이면 1부터 2면 2부터 돌것임
반복문안에서 필요없이 반복하는 부분을 줄여주기위해
end 라는 예를들어서 1, 3 의 입력이면
end 3 , i 4 처럼 end 는 3이 되는데 i 가 3보다 커질때는 반복문을 나오게 된다.
나머지는 그냥 누산해주면 된다.
중간에 주석으로 된 부분이 연산 과정이다.
시간복잡도가 n*m 이지만 반복문의 탈출구와 m의 반복자체도 m 만큼 도는것이 아니기 때문에
시간에 대해서는 염려하지 않았는데 시간 초과가 떴다.
정답코드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
input.shift();
const map = input.shift().split(' ').map(Number);
const TCs = input.map((item) => item.split(' ').map(Number));
const sumArr = Array.from({length : map.length+1}).fill(0);
map.forEach((v, i) => {
sumArr[i+1] = sumArr[i] + v;
})
let answer = '';
TCs.forEach((TC) => {
answer += (sumArr[TC[1]] - sumArr[TC[0]-1]) + '\n';
})
console.log(answer);
이 로직은 그냥 미리 더해주고
더해준 값을 인덱싱해서 찾아가는것 뿐이다.
내 로직을 반복문 한번으로 하기 위해 로직을 나눴다? 정도로 이해하면 될것같다.
728x90
'알고리즘' 카테고리의 다른 글
백준 스택수열 1874 js (0) | 2022.10.25 |
---|---|
백준 ATM 11399 js (0) | 2022.10.21 |
백준 좌표압축 18870 js (0) | 2022.10.17 |
백준 1181 단어 정렬 js (0) | 2022.10.13 |
백준 1300 K번째 수 Js (0) | 2022.10.06 |