반응형
insert 명령어를 어떻게 처리할지 엄청 고민했었다. linked list로 구현하면 너무 비효율적 아닌가,,,ㅠㅠ
vector에 insert함수가 있는데 위치를 가리키는 변수가 const만 가능하다.
따라서 포기하고 다른 사람이 푼 방법들을 참고했다.
https://charm-charm.postype.com/post/3080494 이 분 코드 참고했음.
list를 사용해서 풀었다.
list에는 splice라는 함수가 있는데
splice(p,lt2) : p가 가리키는 위치에 lt2의 모든 원소를 잘라붙인다.
그리고 여기서 p는 list를 가리키는 iterator형식이여야 한다.
(헉,,, 글 쓰다가 깨달았다. vector도 같은 방식으로 해결 가능함.. iterator
그치만 vector에는 splice함수가 없으니까.... 괜찮아 괜찮아....)
* 구현하면서 모르는 부분 ( 궁금한 점 )
Delete 명령어를 구현하는 파트
여기서 arr list에서 iter가 가리키는 부분을 erase하는데
for( k) 안에 구문을
arr.erase(iter);
iter++;
로 변경할 경우 오류가 난다!!
list의 다음 부분을 가리키는데 그 부분이 인덱스 참조 범위를 넘었기 때문일까???? (list의 마지막 부분이여서?)
c++ 구현 코드
// #1225 암호생성기 #include < iostream > #include < string > //cin >> str #include < cstring > //memset #include < list > using namespace std; int main(void) { list < int > arr; for(int tc=1; tc <= 10; tc++){ int sz; // 암호문 입력받기 cin >> sz; for(int i=0; i < sz; i++){ int temp; cin >> temp; arr.push_back(temp); } // 명령어 입력받기 및 처리 int cmd_sz; cin >> cmd_sz; for(int c=0; c < cmd_sz; c++) { char cmd; cin >> cmd; // 명령문 처리 if( cmd == 'I'){ int x, cnt; cin >> x >> cnt; list < int > temp_arr; for(int k=0; k < cnt; k++){ int temp; cin >> temp; temp_arr.push_back(temp); } list < int > ::iterator iter; iter = arr.begin(); while(x > 0){ iter++; x--; } arr.splice(iter, temp_arr); // iter 위치에 temp_arr을 갖다 붙인다. } else if( cmd == 'D' ){ int x, cnt; cin >> x >> cnt; list < int > ::iterator iter; iter = arr.begin(); while(x > 0){ iter++; x--; } // iter가 x위치를 가리키도록 for(int k=0; k < cnt; k++){ arr.erase(iter++); } }else if( cmd == 'A' ){ int cnt; cin >> cnt; for(int k=0; k < cnt; k++){ int num; cin >> num; arr.push_back(num); } } } // 출력 cout << '#' << tc << ' '; for(int k=0; k < 10; k++) { cout << arr.front() << ' '; arr.pop_front(); }cout << '\n'; // 초기화 arr.clear(); } return 0; }
반응형