본문 바로가기
SWE/코테

[SW Expert Academy] '11' #1230 암호문3 **

by S나라라2 2019. 3. 15.
반응형

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;
}

반응형