정수 m개로 이루어진 배열 arr[m]과, 배열의 각 요소에 더할 값 n이 주어집니다. 또한 시작 인덱스와 끝 인덱스를 담고 있는 r개의 쿼리가 제공되며, 각 쿼리마다 해당 범위(시작부터 끝까지)의 모든 배열 요소에 값 n을 더한 후 결과 배열을 출력해야 합니다.
예제
입력:
arr[] = {1, 2, 3, 4, 5}
query[] = { { 0, 3 }, { 1, 2 } }
n = 2
출력:
위 프로그램을 실행하면 다음과 같은 결과가 생성됩니다:
Query1: { 3, 4, 5, 6, 5 }
Query2: { 3, 6, 7, 6, 5 }
이 문제는 비교적 간단한 접근 방식으로 해결할 수 있습니다.
- 주어진 모든 쿼리를 순회하면서, 각 쿼리에 저장된 시작 지점부터 끝 지점까지 배열을 탐색합니다.
- 해당 범위의 요소에 값 n을 더한 뒤, 배열 전체를 출력합니다.
알고리즘
START STEP 1 : 시작(start)과 끝(end) 범위를 저장할 구조체 range 선언 STEP 2 : 함수 add_tomatrix(int arr[], struct range r[], int n, int size, int m)에서 int i, j, k; FOR i = 0 AND i < m AND i++ 반복 FOR j = r[i].start AND j <= r[i].end AND j++ 반복 arr[j] = arr[j] + n END FOR FOR k = 0 AND k < size AND k++ 반복 PRINT arr[k] END FOR END FOR STOP
예제 코드
#include <stdio.h>
struct range{
int start, end; // 배열 요소의 범위를 지정하기 위한 구조체
};
int add_tomatrix(int arr[], struct range r[], int n, int size, int m){
int i, j, k;
for ( i = 0; i < m; i++){ // 정의된 구조체의 모든 쿼리에 대해 반복
for(j = r[i].start; j<= r[i].end; j++){ // 업데이트할 범위의 시작부터 끝까지
arr[j] += n; // 해당 범위의 요소에 값 n을 더함
}
printf("Query %d:", i+1);
for ( k = 0; k < size; k++){
printf(" %d",arr[k]); // 매 쿼리 실행 후 전체 배열 출력
}
printf("\n");
}
}
int main(int argc, char const *argv[]){
int arr[] ={3, 4, 8, 1, 10};
struct range r[] = {{0,2}, {1, 3}, {3, 4}};
int n = 2;
int size = sizeof(arr)/sizeof(arr[0]);
int m = sizeof(r)/sizeof(r[0]);
add_tomatrix(arr, r, n, size, m);
return 0;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 생성됩니다.
Query 1: 5 6 10 1 10 Query 2: 5 8 12 3 10 Query 3: 5 8 12 5 12