문제 : boj11659
필요 알고리즘 개념
- 누적합 알고리즘 (prefix sum)
- 누적합 알고리즘을 사용해 풀 수 있는 문제이다.
※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.
풀이
누적합 알고리즘의 가장 기본이 되는 문제이다. 설명은 적어둔게 있으므로, 누적합 알고리즘을 모른다면 이 글을 읽어보고 풀면 바로 풀 수 있다.
코드 (Java) : github
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int M = 0;
static int[] arr = null;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
arr[0] = Integer.parseInt(st.nextToken());
for (int i = 1; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken()) + arr[i-1];
}
while (K-->0) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
bw.write(arr[b-1] - (a-1==0?0:arr[a-2]) + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
코드 (C++) : github
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
vector<int> arr;
int n, m, tmp;
cin >> n >> m;
arr.push_back(0);
while (n--) {
cin >> tmp;
tmp += arr.back();
arr.push_back(tmp);
}
int a, b;
while (m--) {
cin >> a >> b;
cout << arr[b]-arr[a-1] << '\n';
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 12933 - 오리 (java) (0) | 2022.09.13 |
---|---|
[자바] 백준 4096 - 팰린드로미터 (java) (0) | 2022.09.10 |
[자바] 백준 6799 - Computer Purchase (java) (0) | 2022.09.08 |
[자바] 백준 5993 - Invasion of the Milkweed (java) (0) | 2022.09.08 |
[자바] 백준 15489 - 파스칼 삼각형 (java) (2) | 2022.09.07 |
댓글