알고리즘
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;
}