1. 문제 링크 https://www.acmicpc.net/problem/14648
2. 문제
3. 문제 요약
문제는 길이 N의 수열과 Q의 쿼리가 주어졌을 때, 주어진 조건을 만족하며 답을 출력하는 것이다.
Type1 (1로 시작하는 쿼리)와 Type 2 (2로 시작하는 쿼리)는 다른 알고리즘을 사용한다는 것에 유의하면서 풀면 된다.
4. 문제 풀이
(1) 쿼리의 타입
쿼리의 Type은 주어지는 Input 의 시작 숫자를 이용하여 쉽게 구분할 수 있다.
각 쿼리들에서 공통으로 적용되는 구간과, 차이가 있는 구간을 먼저 정리해보면 다음과 같다.
Type All) SUM(구간 [a,b]의 합) 구하기
Type 1) a와 b를 swap.
Type 2) SUM = SUM - (구간[c, d]의 합)
Type All) SUM 출력하기
(2) 자료형 확인
사실 뜬금없이 틀렸습니다가 떠서 당황했는데,
지문에서 `각 숫자들은 모두 int형 범위 이내` 라길래, 총합 SUM의 자료형을 크게 체크하지 않고 int로 선언했다.
비록 수열의 각 숫자들은 int형 범위 이내라고 나와있어도, 그 숫자들의 합의 범위는 다시 생각해 볼 필요가 있다.
5. 풀이 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public static void problem14648() throws Exception {
N = Integer.parseInt(stk.nextToken());
Q = Integer.parseInt(stk.nextToken());
arr = new int[N + 1];
stk = new StringTokenizer(br.readLine());
for (int n = 1; n <= N; n++)
arr[n] = Integer.parseInt(stk.nextToken());
for (int q = 0; q < Q; q++) {
query();
}
}
Colored by Color Scripter
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public static void query() throws Exception {
stk = new StringTokenizer(br.readLine());
int type = Integer.parseInt(stk.nextToken());
int a = Integer.parseInt(stk.nextToken());
int b = Integer.parseInt(stk.nextToken());
long sum = 0;
for (int i = a; i <= b; i++) sum += arr[i];
if (type == 1) {
arr[0] = arr[a];
arr[a] = arr[b];
arr[b] = arr[0];
} else {
int c = Integer.parseInt(stk.nextToken());
int d = Integer.parseInt(stk.nextToken());
for (int i = c; i <= d; i++) sum -= arr[i];
}
}
Colored by Color Scripter
|
'백준 > 백준' 카테고리의 다른 글
[ 백준 9095 ] 1, 2, 3 더하기 (0) | 2019.11.15 |
---|---|
[ 백준 1966 ] 프린터 큐 (0) | 2019.11.07 |
[ 백준 11404 ] 플로이드 (0) | 2019.11.05 |
[ 백준 4963 ] 섬의 개수 (0) | 2019.11.04 |
[ 백준 1978 ] 소수 찾기 (0) | 2019.11.03 |