코딩테스트/코드업

1차원 차이 배열 만들기 5-3 C++(1494)[코드업, codeup]

멍토 2019. 12. 25.

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀 더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소입니다.

https://codeup.kr/problem.php?id=1494

 

[기초-배열연습] 1차원 차이 배열 만들기 5-3

크기가 n인 1차원 배열 d[]에 대해 k개의 구간 [s, e]와 u를 입력 받아, d[s] = d[s]+u; d[e+1] = d[e+1]-u; 를 수행한 후, 누적 합을 만들어 출력해보자. 크기가 7이고, 4개의 구간 데이터 1 2 1 2 3 1 3 4 1 4 5 1 가 입력되면 1차원 배열의 상태는  1 1 0 0 –1 –1 0 가 되며 그 누적합을 계산하면 아래와 같다. 1 2 2 2 1 0 0

codeup.kr


1. 문제

2. 문제 해석

3. 소스 코드


문제

크기가 n인 1차원 배열 d[]에 대해

k개의 구간 [s, e]와 u를 입력 받아,

d[s] = d[s]+u;
d[e+1] = d[e+1]-u;

를 수행한 후, 누적 합을 만들어 출력해보자.

크기가 7이고,

4개의 구간 데이터
1 2 1
2 3 1
3 4 1
4 5 1

가 입력되면

1차원 배열의 상태는 
1 1 0 0 –1 –1 0
가 되며

그 누적합을 계산하면 아래와 같다.
1 2 2 2 1 0 0

입력

첫 번째 줄에 배열의 크기 n과 구간의 개수 k가 공백을 두고 입력된다.
두 번째 줄부터 k개의 데이터가 공백을 두고 입력된다.
[입력값의 정의역]
1 <= k <= n <= 100
0 < s <= e < n
-1000 <= u <= 1000

출력

첫 번째 줄에는 배열의 상태를 출력한다.
두 번째 줄에는 누적합을 계산해 출력한다.

입력 예시

7 4
1 2 1
2 3 1
3 4 1
4 5 1

출력 예시

1 1 0 0 -1 -1 0 
1 2 2 2 1 0 0 


2. 문제풀이

문제이해가 어려웠습니다.

k개의 구간 [s, e]와, u를 입력받아

d[s] = d[s]+u;
d[e+1] = d[e+1]-u;

수행하라고 합니다.

4개의 구간 데이터
1 2 1
2 3 1
3 4 1
4 5 1

가 들어온다고 할때

s e u
s e u
s e u
s e u

로 생각하시면 됩니다.

누적합은

이전 누적합 + 배열상태로 처리해주시면 됩니다.

코드는 아래와 같습니다.


3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
using namespace std;
 
int main() {
    int k, n, arr[101]{ 0 }, arr2[101]{ 0 }, arr3[3];
    cin >> k >> n;
    //n개만큼의 데이터가 들어온다
    for (int i = 1; i <= n; i++) {
        //데이터는 s, e, u 순으로 들어온다.
        cin >> arr3[0>> arr3[1>> arr3[2];
        //d[s] = d[s] + u;
        arr[arr3[0]] = arr[arr3[0]] + arr3[2];
        //d[e+1] = d[e+1] - u;
        arr[arr3[1+ 1= arr[arr3[1+ 1- arr3[2];
    }
    //1차원 배열상태 출력하기
    for (int i = 1; i <= k; i++)        cout << arr[i] << " ";
    cout << endl;
    for (int i = 1; i <= k; i++) {
        //이전 누적합 + 현재배열상태를 더하고 출력
        arr2[i] = arr2[i - 1+ arr[i];
        cout << arr2[i] << " ";
    }
    return 0;
}

댓글

💲 광고입니다.