알고리즘

1차원 격자(시뮬레이션, 비공풀이)

kcj3054 2021. 12. 8. 23:24

문제

문제는 일차원으로 된 배열에서 '시작 위치에서' '끝 위치'까지 n번 격자인덱스를 빼내면된다.

  • 예를 들어 n이 6인데 1 2 3 1 1 5에서 [2, 4] [2, 2]위치의 격자 인덱스를 빼면 결과는 격자에 [1, 5]만 남게된다.

풀이

  • 처음에 잘못된 풀이로 배열 arr 에서 tmp로 왔다 갔다를 너무 많이 했다 아주 필요했다 그러나 이것을 전환해서 cutting하는 함수를 따로 빼내면 아주 좋게된다.

  • 아주 중요한 key포인트는 변수 2개이다. endofArray, end_of_temp_array이다 이것들은 배열의 크기를 알려준다.

  • 처음 arr 배열의 크기는 n이기에 endOfArray는 n이다.

  • 이후 CutArray는 s에서 e를 자르면 되기때문에 반대로 생각하면 이부분을 제외한 부분을 tmp 배열에 넣으면되는 것이다.

  • tmp배열에 다 넣어두고, 다시 tmp배열을 arr배열에 넣어두면된다.

  • 또한 arr배열의 크기가 달라졌기때문에 endOfArray의 값도 endOfArray = end_of_temp_array로 변경해주면된다.

첫번째 복잡한 소스

#include <bits/stdc++.h>

using namespace std;


int n, s1, e1, s2, e2;
int arr[200];
int tmp[200];
int main() {
    cin >> n;
    for(int i = 1; i <=n; i++) cin >> arr[i];
    cin >> s1 >> e1 >> s2 >> e2;

    for(int i = s1; i <= e1; i++) arr[i] = 0; // -> 1 0 0 0 1 5 -> 중간의 0을 제하자 


    int idx = 1;
    for(int i = 1; i <=n; i++) {
        if(arr[i] != 0) {
            tmp[idx++] = arr[i];
        } 
    }
    // tmp -> 1 1 5

    for(int i = s2; i <=e2; i++) {
      tmp[i] = 0;
    }

    memset(arr, 0, sizeof(arr));
    idx = 1;
    for(int i = 1; i <=n; i++) {

        if(tmp[i] == 0) continue;
        arr[idx++] = tmp[i];
    }

    //갯수 찾기 
    int ansCnt = 0;
    for(int i = 1; i<=n; i++) {
        if(arr[i]) ansCnt++;
    }
    cout << ansCnt << endl;
    for(int i = 1; i <=ansCnt ; i++) {
        cout << arr[i] << endl;
    }

    return 0;
}

두번째 깔끔한 소스

#include <bits/stdc++.h>

using namespace std;


int n, s, e;
int arr[200];
int endOfArray, end_of_temp_array;

void CutArray(int startIdx, int endIdx) {
    int tmp[200] = { 0, };
    end_of_temp_array = 0;

    //구간외 부분만 tmp배열에 넣는다 
    for (int i = 0; i < endOfArray; i++) {
        if (i < startIdx || i > endIdx) {
            tmp[end_of_temp_array++] = arr[i];
        }
    }

    //tmp를 다시 arr로 옮기기
    for (int i = 0; i < end_of_temp_array; i++) {
        arr[i] = tmp[i];
    }
    endOfArray = end_of_temp_array;
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> arr[i];
    endOfArray = n;

    for (int k = 0; k < 2; k++) {
        cin >> s >> e;
        s--, e--;
        CutArray(s, e);
    }

    cout << endOfArray << endl;

    for (int i = 0; i < endOfArray; i++) cout << arr[i] << endl;

    return 0;
}