728x90
시간 제한 2초, 메모리 제한 256MB
# 조건
- 창영이가 에러를 찾기 위해서 디버깅을 하고 있다.
- 이 프로그램은 크기가 N이고 0으로 채워져있는 배열을 a를 만들고, 아래 something 함수를 호출한다.
void something(int jump) {
int i = 0;
while (i < N) {
a[i] = a[i] + 1;
i = i + jump;
}
}
- 창영이는 함수를 K번 호출하려고 한다.
- 각각 호출할 때, 인자로 넘기는 jump의 값은 X1, X2, X3, ... Xk 순서이다.
- 이렇게 호출한 뒤에는 배열의 값이 정상적으로 들어갔는지를 확인하려고 한다.
- 확인은 총 Q번 하고, 매번 확인을 할 때마다 L과 R(L ≤ R)을 정한뒤, 그 구간의 배열의 합을 구한다.
- 즉, a[L] + a[L+1] + ... + a[R]을 구한다.
- 함수를 호출할 때 필요한 X의 값과 창영이가 확인한 횟수 Q가 주어졌을 때, 확인한 결과(배열의 합)을 구하는 프로그램을 작성하시오.
입력
- 첫째 줄에 배열의 크기 N과 함수의 호출 횟수 K가 주어진다. (1 ≤ N, K ≤ 10^6)
- 둘째 줄에 함수를 호출할 때 사용하는 인자의 값 X1, X2..., Xk가 공백으로 구분되어 주어진다. (1 ≤ Xi < N)
- 셋째 줄에는 확인하는 횟수 Q가 주어진다. (1 ≤ Q ≤ 10^6)
- 넷째 줄부터 Q개 줄에는 각 확인에 사용하는 L과 R이 주어진다. (0 ≤ L ≤ R < N)
출력
- 출력은 총 Q줄이다.
- 창영이가 확인하는데 사용한 L과 R이 주어졌을 때, a[L] + a[L+1] + a[L+2] ... + a[R]을 출력한다.
# 접근 방법
- 우선 주어지는 something 함수를 풀이할 언어에 맞게 변경하여 정의해준다.
- 구간의 합을 확인하는 문제이므로 누적합을 이용해준다.
- something함수를 K번 호출한다면 100만번까지 가능하므로, Counter 함수를 이용해준다.
- 주어진 jump의 숫자들이 몇 번씩 등장하는지 Counter를 이용하여 딕셔너리로 구해준다.
- Counter를 순회하며 jump의 값과 등장 횟수를 something 함수로 넘겨준다.
- 따라서, something 함수에서 +1이 + 등장 횟수로 변경된다.
- 이후, 완성된 arr의 누적합을 구한 뒤 주어지는 구간의 합을 출력하면 된다.
- 주어지는 구간이 처음이 주어질 수 있으므로 prefix의 제일 뒤에 0을 붙여준다.
- 즉, 시작과 끝까지의 구간을 구하라한다면 prefix[end] - prefix[-1]을 수행해주면 제일 뒤가 0이므로
- 처음과 끝의 구간 합을 구해줄 수 있다.
- 주어지는 구간이 처음이 주어질 수 있으므로 prefix의 제일 뒤에 0을 붙여준다.
import sys
input = sys.stdin.readline
from collections import Counter
def main():
def something(j, v):
i = 0
while i < N:
arr[i] += v
i += j
N, K = map(int, input().split())
arr = [0] * N
jump = list(map(int, input().split()))
cnt = Counter(jump)
for k in cnt:
something(k, cnt[k])
prefix = [0] * (N+1)
prefix[0] = arr[0]
for i in range(1, N):
prefix[i] = prefix[i-1] + arr[i]
for _ in range(int(input())):
a, b = map(int, input().split())
print(prefix[b] - prefix[a-1])
if __name__ == '__main__':
main()
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 17144번] 파이썬 - 미세먼지 안녕! (0) | 2023.09.03 |
---|---|
[백준 12871번] 파이썬 - 무한 문자열 (0) | 2023.08.31 |
[백준 14921번] 파이썬 - 용액 합성하기 (0) | 2023.08.28 |
[백준 15787번] 파이썬 - 기차가 어둠을 헤치고 은하수를 (0) | 2023.08.25 |
[백준 22943번] 파이썬 - 수 (0) | 2023.08.24 |