-
[백준/C++] 10926번 : ??!코딩/백준(알고리즘) 2022. 11. 15. 23:55
백준 10926번 : ??!
풀이
#include <iostream> using namespace std; int main(void) { string str; // c++에서는 string 자료형을 통해 문자열을 보다 쉽게 다룰 수 있다. cin >> str; cout << str + "\?\?!" << endl; // '/?'는 '?'와 똑같은 의미이다. "이스케이프 시퀀스"를 구글링해보자. return 0; }
백준 단계별로 풀어보기 중 첫 번째 카테고리 "입출력과 사칙연산"에 새롭게 추가된 문제 중 하나이다. 이 문제에서는 "??!"을 출력하는 부분이 이 문제의 핵심이다. 사실 그냥 "\?\?!" 대신 "??!"을 출력해도 맞았다고 뜬다. 하지만 나의 경우 컴파일러에서 아래와 같은 경고 메시지를 띄웠다.
구글링 해보니 왜 이런 경고 메시지가 뜨는지 알 수 있었다. 옛날 옛적에 C가 처음 쓰이게 되었을 때, 일부 사람들은 텔레타이프(키보드와 프린터가 합쳐진 기계)를 사용했다고 한다. 그런데 이 텔레타이프는 오직 64개의 문자만 쓰일 수 있도록 설계되었다. 하지만 C언어는 소괄호(), 중괄호{}, 대괄호[] 등의 문자가 꼭 필요한데, 텔레타이프에는 {}, [] 이런 문자를 쓸 수가 없었다. 그래서 위의 에러 메시지에 쓰여 있는 것처럼, trigraph라는 게 도입되었다.
??= 라고 텔레타이프에 치면 #으로 나타내주고, ??( 라고 치면 [ 이라고 나타내자고 일종의 약속을 한 것이다. 그래서 이 trigraph에 따르면, ??!는 | 이라는 문자로 대응된다(OR을 의미하는 || 중 하나). 그래서 비록 요즘은 컴파일러에서 그냥 trigraph를 적용하지 않고 제대로 출력해주지만, 혹시 trigraph가 설정된 실행환경에서는 예상과 다른 출력이 발생할 수 있기 때문에 경고 메시지를 출력한 것이다.
그래서 이 문제의 경우, '?'와 같은 의미의 이스케이프 시퀀스인 '\?'을 사용하면 앞서 말한 리스크를 줄일 수 있다는 것을 알려주는 취지로 만들어진 것 같다.
참고한 문서 : https://www.microchip.com/forums/m409607.aspx
문제 링크
백준 10926번 : ??!
https://www.acmicpc.net/problem/10926'코딩 > 백준(알고리즘)' 카테고리의 다른 글
[백준/C++] 18108번 : 1998년생인 내가 태국에서는 2541년생?! (0) 2022.11.16 [백준/C++] 1008번 : A/B (0) 2022.11.15 [백준/C++] 1000번 : A+B (0) 2022.11.15 [백준/C++] 2557번 : Hello World (0) 2022.11.15