전공공부
[BOJ_21318] 피아노 체조 본문
설명
최대 N,Q가 100000인 건으로 일일이 다 체크하면 무조건 시간 초과가 나는 문제였습니다. 따라서, 누적합을 활용하여 문제를 풀었습니다. for N문으로 한 번에 누적된 케이스들의 값을 계속 끌고 가면서 그 사이에 위치한 사이 값이면 해당 누적합의 차이 만큼 빼서 사이에 얼마나 다음 케이스가 큰 케이스인지 체크해 푼 문제 입니다.
코드
package BOJ.prefix_sum;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class BOJ_21318 {
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(in.readLine());
List<Integer> melody = new ArrayList<Integer>();
StringTokenizer tk = new StringTokenizer(in.readLine()," ");
for (int i = 0; i < N; i++){
melody.add(Integer.parseInt(tk.nextToken()));
}
int Q = Integer.parseInt(in.readLine());
int[] sum = new int[N];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N - 1; i++){
if(melody.get(i) > melody.get(i + 1)){
sum[i + 1] = sum[i] + 1;
}else{
sum[i + 1] = sum[i];
}
}
while (Q-- > 0) {
tk = new StringTokenizer(in.readLine(), " ");
int x = Integer.parseInt(tk.nextToken()) - 1;
int y = Integer.parseInt(tk.nextToken()) - 1;
sb.append(sum[y] - sum[x] + "\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
https://www.acmicpc.net/problem/21318
'Study > Problem Solving' 카테고리의 다른 글
[BOJ_1749] 점수따먹기 (0) | 2024.05.12 |
---|---|
[BOJ_17123] 배열 놀이 (0) | 2024.05.06 |
[BOJ_20438] 출석 체크 (0) | 2024.04.28 |
[BOJ_11000] 강의실 배정 (0) | 2024.04.07 |
[BOJ_20365] 블로그2 (0) | 2024.04.04 |