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