결국에 이 문제는 처음에 입력으로 주어지는것이 [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를 맨 마지막에 시행해주어서 딱 한번 뒤집어주는걸 잘 이해하도록 하자.
'알고리즘 > BOJ' 카테고리의 다른 글
BOJ 7576 토마토 || 내 풀이와 거기에서 더 좋은 개선사항. (0) | 2023.09.16 |
---|---|
boj 11003 최솟값 찾기 || deque를 이용한 풀이에 대해서. (0) | 2023.09.10 |
boj 6549 히스토그램에서 가장 큰 직사각형 || 해당 문제에 대해서 색달라 보이게 접근한 풀이법에 대하여. (0) | 2023.09.05 |
boj 3015번 문제에 대한 새로운 풀이를 찾다가 발견한 색다른 방법에 대하여. 이런 형태로 작성하는 것을 이해해보자. (0) | 2023.09.04 |
boj 6198 옥상 정원 꾸미기 || 이 문제를 통해서, 예제가 제시해주는 형태로 답을 낼 필요가 없다는 것에 대해서 배움. (0) | 2023.08.31 |