본문 바로가기
알고리즘

[BAEKJOON] 14648 쿼리 맛보기

by mAlfred 2023. 11. 22.
반응형

문제

어떤 문제에 비슷한 형태의 질문이 여러 개 주어지는 문제를 쿼리 문제라고 부른다. 쿼리 문제는 쿼리가 주어진 순서대로 실행해서 해결할 수도 있지만, 그것이 불가능하거나 조건이 맞는 경우에는 쿼리의 순서를 임의로 바꿔서 더 편하게 해결할 수도 있다. 우리는 예선 문제에 쿼리에 대한 설명이 등장했기 때문에 본선 문제에 쿼리 문제가 나올 것이라는 예상을 쉽게 해볼 수 있다.

이 문제에서는 길이 n의 수열과 q개의 쿼리가 주어진다. 주어지는 쿼리의 종류는 다음과 같다.

  • 1 a b : [a, b] 구간의 합을 구해서 출력하고, a번째 수와 b번째 수를 서로 스왑(swap) 한다.
  • 2 a b c d : [a, b] 구간의 합에서 [c, d] 구간의 합을 뺀 값을 출력한다.

[a, b] 구간의 합이란, 수열의 a번째 부터 b번째 까지 수를 모두 더한 값을 의미한다.

입력

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

출력

주어진 쿼리의 출력값을 q개의 줄에 걸쳐 출력한다.

예제 입력 1 복사

5 2
3 5 -2 3 -12
2 1 3 2 4
1 2 5

예제 출력 1 복사

0
-6

예제 입력 2 복사

7 3
12 5 -1 0 -4 3 -10
1 2 7
2 1 4 2 3
2 1 7 3 4

예제 출력 2 복사

-7
12
6

 


이 문제는 잘 생각해야되는 것은 인덱스 값이 1이면 0번쨰를 접근해야된다는 것.

 

import sys

n, q = map(int, sys.stdin.readline().strip().split())

v = list(map(int, sys.stdin.readline().strip().split()))

for _ in range(q):
    p = list(map(int, sys.stdin.readline().strip().split()))
    if(p[0] == 1):
        print(sum(v[(p[1] - 1):(p[2])]))
        tmp = v[p[1]-1]
        v[p[1]-1] = v[p[2]-1]
        v[p[2]-1] = tmp
       
    elif(p[0] == 2):
        print(sum(v[p[1]-1:v[2]])-sum(v[p[3]-1:p[4]]))

 

처음에 작성한 것

근데 왜 안되는지 잘 모르겠다,,

 

import sys

n, q = map(int, sys.stdin.readline().strip().split())

v = list(map(int, sys.stdin.readline().strip().split()))

for _ in range(q):
    p = list(map(int, sys.stdin.readline().strip().split()))
    if(p[0] == 1):
        print(sum(v[(p[1] - 1):(p[2])]))

        v[p[1]-1], v[p[2]-1] = v[p[2]-1], v[p[1]-1]
       
    elif(p[0] == 2):
        ret1, ret2 = 0, 0
        for i in range(p[1] - 1, p[2]):
            ret1 += v[i]
        for i in range(p[3] - 1, p[4]):
            ret2 += v[i]
        print(ret1 - ret2)

 

그래서 그냥 무식하게 반복을 돌렸다.

 

반응형

'알고리즘' 카테고리의 다른 글

[BAEKJOON] 7287 등록  (0) 2023.11.22
[BAEKJOON] 26265 멘토와 멘티  (0) 2023.11.22
[BAEKJOON] 10699 오늘 날짜  (0) 2023.11.22
[BAEKJOON] 1357 뒤집힌 덧셈  (0) 2023.11.22
[BAEKJOON] 1225 이상한 곱셈  (0) 2023.11.19