고양이 입력 문제를 풀어보자
10171번 고양이
위 문제는 단계별 문제 중 입력출력 문제에 해당하는 문제이다. 보통 쉽게 생각할 수 있지만, 나에게 puts를 사용하면 더 좋다는 것을 알려 준 문제이다.
현재 업무에서 C++을 언어를 주 언어로 하다보니, C++로 모든 것을 연습하고자한다. 따라서 이번 문제도 C++를 보고 풀었으나, 다른 사람들이 푼 소스코드를 보고 put의 정리의 필요성을 느껴 포스팅을 한다.
문제
고양이 문제는 주어진 출력을 하면 된다.
아래의 사진을 출력하면 되는 문제이다.
문제 풀이
나는 C++을 이용해 고양이의 선을 어떻게 출력할지 고민하고 아래와 같이 풀었다.
int main()
{
cout << "\\ /\\" << endl << " ) ( ')" << endl << "( / )" << endl << " \\(__)|";
}
여기서 중요한 포인트는 두가지이다.
- ”«” 을 통해 연쇄적으로 출력이 가능하다는 점
- ”" 표현하기 위해서는 \를 두 번써야한 다는 점
다른 사람 풀이
다른 사람들의 풀이를 비교해 본 결과 (c++ 기준) cstdio 헤더 내 존재하는 puts를 이용해서 풀었다.
int main()
{
puts("\\ /\\\n ) ( ')\n( / )\n \\(__)|");
}
위의 코드와 본인의 코드는 문법상 다른 것 말고 차이가 없다. 하지만 “문법”이 중요한 차이를 보여준다.
-
cout vs puts cstdio (c언어의 stdio.h 내 존재하는 함수를 c++ wrapping함) 내 존재하는 puts 함수 같은 경우 메모리 접근 을 통해 포인터 방식으로 출력한다. 반면, cout 같은 경우 내부적으로 stream 버퍼를 갖고 있고 stream 버퍼 자체를 출력한다. cout은 객체로 다양한 정보를 갖고 있다는 점도 차이가 있다. 즉, cout을 쓰면 puts에 비해 무거우며, 속도상 차이가 존재할 수 있다.
-
endl vs \n 위의 차이도 중요하다. endl 같은 경우 함수이고, \n 같은 경우 compile가 해석하는 문법이다. endl 같은 경우 함수의 포인터를 이용해 내부적으로 호출되고 있다. 따라서, 나중에 데이터가 많아 질 경우 오답이 나오는 경우가 종종 존재하곤했다.
사용자가 보기에는 별 차이가 없어보이지만, 실제 내부적으로는 두 동작이 다르다. 나중에 메모리가 많아진 케이스에서는 c++ 객체로 이루어진 출력이 아닌 C 표준 입출력 (cstdio) 을 사용하는 것이 좋다.