[C++] 코딩할때 '\b' 문자에 관하여
https://www.acmicpc.net/problem/5430
백준 5430: AC 문제를 풀고 있었다.
이 문제는 어떤 deque 배열이 {1,2,3,4} 이런 식으로 있으면 답을 [1,2,3,4] 형태로 출력해야 하는 문제다.
cout<<'[';
while(!dq.empty())
{
if(!fr)//fr는 bool 자료형 변수이고, fr이 false면 뒤에서부터, true면 앞에서부터 출력해야 한다
{
cout<<dq.back()<<",";
dq.pop_back();
}
else
{
cout<<dq.front()<<",";
dq.pop_front();
}
}
cout<<"\b]\n";
나는 이런 식으로 출력을 했다.
즉, 먼저 '['를 출력 후 deque 속 모든 값에 대해 그 값과 이어서 ','를 출력한다. 그 후 ']'를 출력한다.
그럼 이런 식으로 될 것이다.
[1,2,3,4,]
마지막 값 이후에 필요없는 ','이 하나 추가된 것이다.
그래서 나는 "한 칸 뒤로가기" 문자인 '\b'로 그 쉼표를 지우려 한 것이다.
그러면 출력 시 정상적으로
[1,2,3,4]
로 출력이 된다.
다만, 이걸 백준에 그대로 제출하면 틀렸다고 나온다.
정확한 원리는 모르지만, 백준의 정답처리 프로그램에서는 출력을
[1,2,3,4]
가 아니라
[1,2,3,4,\b]
로 인식해 틀렸다고 채점하는 것 같았다.
https://www.acmicpc.net/blog/view/70
이 블로그 글을 참고하면,
\b'는 하나의 문자일 뿐, 정말로 출력했던 문자를 도로 지우는 문자가 아닙니다. 단지 화면에 내보낼 때만 지운 것처럼 보이게 할 뿐입니다. 출력했던 문자는 지울 수 없습니다.
이라고 한다.
따라서 이미 출력한 문자를 지우고 싶다고 '\b'를 이용하는 것은 올바른 방법이 아니다.
그래서 나는 코드를 이렇게 고치고, 정답 처리를 받았다.
cout<<'[';
while(!dq.empty())
{
if(!fr)
{
cout<<dq.back();
dq.pop_back();
}
else
{
cout<<dq.front();
dq.pop_front();
}
if(!dq.empty())
{
cout<<",";
}
}
cout<<"]\n";
'\b' 문자를 이론으로는 오래 전에 배웠지만, 실제로 써보는 것은 처음이라 이런 실수를 했다.
하필 이 문제가 같은 퍼센트(16%)에서 오답처리를 받는 사람이 굉장히 많아 게시판에서 받은 반례를 전부 다 넣어봐도 오류를 찾을 수 없어 문제를 찾는 데 시간이 오래 걸려버렸다.
다만 나와 같은 실수를 한 사람이 올린 글이 정말 도움되었다.
https://www.acmicpc.net/board/view/142151