boj 5430 AC || parser를 어떻게 구현할 것인가가 핵심이다.

결국에 이 문제는 처음에 입력으로 주어지는것이 [1,2,5,45] 같은 형태로 주어지기 때문에 이걸 어떤식으로 입력을 받아낼지가 문제의 구현 영역에서 많은 영향을 미친다. 그것만 제대로 해낼 수 있다면 그렇게 어렵게 느껴지지 않을 수준의 문제라는 생각이 든다.

 

이때에 알고리즘 문제를 푸는데에 있어서 약간의 팁 이라고 할만한 부분은, 

[1,2,5,45] 같은 형태로 주어지기 때문에, 첫번째와 맨 끝은 항상 [ 과 ] 이라는 것이고, 이것은 알고리즘 문제에서는 변동사항이 아니고 불변이기 때문에 그 부분에 대해서는 첫번째와 마지막을 제외한 부분들에 대해서 입력을 받으면 더욱 간결하게 parser 함수를 작성할 수 있다는 것이다. 

 

그래서 가운데 있는 부분들의 숫자를 받을것이고, 이것은 결국 string으로 받았다가 그 string 속에 있는 수들을 int로 바꾸어서 입력받을 것이고, 그렇게 하기 위해서는 100과 십의자리 숫자와 일의자리 숫자를 어떻게 해야 받을 수 있는지 잘 알고있어야 한다. 

 

이때에 string에 인덱스로 접근해서 각각의 char에 접근할 수 있기 때문에, 그걸 활용하고, 숫자들이 연속적으로 ' , ' 이 없이 나타나면 그 수들은 단위가 올라가는 양의 정수가 되게 짜려면

 

void parse(string& tmp, deque<int>& d){
    int cur=0;
    for(int i=1; i+1<tmp.size(); i++){
        if(tmp[i]==','){
            d.push_back(cur);
            cur=0;
        }
        else{
            cur=10*cur+(tmp[i]-'0');
        }
    }
    if(cur!=0) //맨 마지막 녀석은 ','을 안만나기 때문에 안넣어져서 이렇게 따로 넣음.
        d.push_back(cur);
}

 이와같이 작성할 수 있다. 

위에서 언급한대로, 처음에는 [ 가 나올것이고 맨 마지막에는 ] 가 나올것이기 때문에 그것들을 받아줄 필요가 없다는걸 잘 인식하면

for(int i=1; i+1<tmp.size(); i++) 형태처럼 첫번째와 맨 마지막을 제외한 부분들에 대한 처리만 해주면 되고, 

cur=10*+(tmp[i]-'0'); 형태로 작성한 코드를 통해서 각각의 char에 대해서 이것들을 숫자가 증가하는 것들을 일의자리 십의자리 백의자리 형태로 만들어 나갈 수 있고, 

tmp[i]==','일때에 실행하는 코드를 통해서 cur 에 담긴 정수를 deque에 담아주고 다시 cur을 초기화 해주면 원하는 형태로 정수들을 string에서 파싱할 수 있게 된다. 

 

 

그리고 이 문제에서 맨 마지막에 deque 에 담긴 수들을 출력할때 있어서 이것이 R을 홀수번 만나서 뒤집혔는지 아닌지에 때라서

출력해야 하는 방향이 달라지는데, 그걸 구현하는 방법중에 하나로, 

        if(isWrong)
            cout<<"error\n";
        else{
            if(rev) reverse(d.begin(),d.end());
            print_result(d);
        }

이와같이 reverse(d.begin(), d.end()); 를 이용해서 맨 마지막에 모든 수들을 뒤집어서 출력해주는 방법이 있다. 

reverse를 맨 마지막에 시행해주어서 딱 한번 뒤집어주는걸 잘 이해하도록 하자. 

 

  Comments,     Trackbacks