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
'공부 > 코딩' 카테고리의 다른 글
FWA 2부: 플로이드 워셜 알고리즘에서 경로 복원하기 (0) | 2025.03.08 |
---|---|
FWA 1부: 플로이드-워셜 알고리즘과 주의사항 (반복문의 순서가 중요한 이유) (0) | 2025.03.06 |
고려대학교의 마이크로디그리 제도 (0) | 2025.02.16 |
게일 섀플리 알고리즘(Gale–Shapley algorithm) (1) | 2024.11.10 |
C++과 Java에서 Priority Queue의 차이점 (0) | 2023.10.19 |