공부/코딩

[C++] 코딩할때 '\b' 문자에 관하여

finding wangdo 2024. 12. 15. 22:44

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