본문 바로가기

백준/백준

[ 백준 14648 ] 쿼리 맛보기

1. 문제 링크 https://www.acmicpc.net/problem/14648

 

14648번: 쿼리 맛보기

첫째 줄에 수열의 길이를 뜻하는 n(1≤n≤1,000)과 쿼리의 개수를 뜻하는 q(1≤q≤10,000)가 주어진다. 둘째 줄에 길이 n의 수열이 하나의 공백을 사이에 두고 주어진다. 수열의 각 숫자들은 모두 int형 범위 이내이다. 이후 셋째 줄 부터 q개의 줄에 걸쳐 쿼리가 주어진다. 쿼리의 형식은 “1 a b” 또는 “2 a b c d”이다. a, b, c, d는 n보다 작거나 같은 자연수이며, a≤b, c≤d임이 보장된다.

www.acmicpc.net

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();
        bw.write(sum + "\n");
    }
    bw.flush();
}
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];
    }
    bw.write(sum + "\n");
}
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