[백준] 2557번 : Hello World - [C++]
-
문제
- 백준 알고리즘 문제와 C++
필자의 블로그를 방문하셨던 적이 있었다면 알겠지만, 필자가 가장 먼저 시작한 포스팅은 모두 Java였다. 이 글을 쓴 시점이 백준 알고리즘 포스팅만 150개가량 썼던 만큼 이제 다른 언어로 풀이하는 것도 같이 병행해야겠다 싶어 시작하게 되었다.
그럼 백준 알고리즘 문제를 처음 마주하는 분들을 위해 백준 알고리즘의 특성에 대해 잠깐 언급하고 넘어가겠다.
일단 앞으로도 필자의 경우 C++14를 기준으로 풀 것이다. 물론 여러분들이 C++11, C++17 등 타 버전으로 제출하더라도 큰 문제가 없도록 기존에도 존재했던 표준 라이브러리들 위주로 쓸 것이다.
다만, 되도록이면 C++ 11 을 포함한 그 이후 버전. 즉, modern C++ 를 기준으로 제출하길 바란다.
그리고 백준에서의 입출력은 다음과 같이 하면 된다.
무슨말인가 하면 여러분이 처음 언어를 배울 때 '콘솔 입력', '콘솔 출력' 을 배웠을 것이다.
예로들어 scanf, printf, cin, cout 같은 것들이다. 이러한 표준 입출력을 사용하여 입출력을 하면 된다.
자세한 내용은 아래 링크를 보시면 된다.
그리고 마지막으로 중요한 점이 세 개 있다.
1. 백준에서 주어진 입력 범위 외의 데이터는 들어오지 않는다.
2. 백준에서 정해진 출력 형식 외의 다른 것을 출력하면 틀린다.
3. 입력과 출력은 구분되어있다.
1번과 2번을 따르자면 여러분이 굳이 입력 데이터에 대해서 범위 밖의 데이터를 예외 처리 할 필요도 없고, 주어진 문제 내의 정답 외에 따로 출력 할 것은 없다.
3번의 경우 무슨말인가하면, 어떤 문제에서 주어진 입력에 따른 출력이 있을 때, 매 번 입력받은 뒤 출력 할 필요가 없다는 뜻이다. 만약 N개의 케이스가 입력으로 주어진다면, N개의 케이스에 대해 모조리 입력 받은 뒤, 나중에 한 번에 출력해주어도 된다는 뜻이다.
백준에서는 오로지 '출력이 일치하는가'를 보기 때문에 한 케이스마다 출력해줄 필요가 없다는 것이다.
이 부분은 앞으로 문제를 풀면서 차차 알게 될 것이다.
- 알고리즘 [접근 방법]
사실 이 문제는 가장 기본적인 출력 문제인지라 별다르게 알고리즘을 설명 할 것은 없다. 다만, 출력에 대해서 몇 가지만 짚고 넘어가고자 한다. 앞으로 알고리즘을 푸는데 있어 도움이 될 것이다.
C++ 을 배워보신 분은 알겠지만 기본적으로 3가지의 입출력 방식이 있다.
1. iostream : C++의 표준 입출력 헤더파일이다. 대표적으로 입력은 cin, 출력은 cout이 있다.
#include <iostream>
main() {
int a;
std::cin >> a; // 입력
std::cout << a; // 출력
}
2. stdio.h : C++ 는 기본적으로 C의 확장버전이라고 이해하면 쉽다. 즉, C의 표준 라이브러리를 사용할 수 있기 때문에 C의 표준 라이브러리 헤더 파일을 include하여 해당 함수들을 쓸 수 있다.
#include <stdio.h>
main() {
int a;
scanf("%d", &a); // 입력
printf("%d", a); // 출력
}
3. cstdio : stdio.h와 크게 다를 것은 없다. C언어에서는 namespace 개념이 없지만, C++에서는 namespace를 지원하면서 C언어의 표준라이브러리를 namespace 안에서도 사용할 수 있도록 한 것이다. 함수 자체 기능상의 차이점은 없다.
#include <cstdio>
main() {
int a;
scanf("%d", &a); // 입력 std::scanf 도 가능함
printf("%d", a); // 출력 std::printf 도 가능함
}
- 3가지 방법을 사용하여 풀이한다.
위에서 설명한 3가지 출력 방법을 각각 풀이할 것이다.
1 . iostream
2. stdio.h
3. cstdio
- 풀이
- 방법 1 : [iostream]
#include <iostream>
int main() {
std::cout << "Hello World!";
return 0;
}
가장 기본적인 방법이라 할 수 있겠다.
- 방법 2 : [stdio.h]
C언어 표준 입출력 라이브러리 헤더를 사용하는 방법이다.
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
- 방법 3 : [cstdio]
stdio.h 와 다를 건 없다.
#include <cstdio>
int main() {
printf("Hello World!");
return 0;
}
- 성능
채점 번호 : 25959139 - 방법 3 : cstdio
채점 번호 : 25959131 - 방법 2 : stdio.h
채점 번호 : 25959120 - 방법 1 : iostream
여기서 보면 iostream 출력이 좀 더 메모리가 큰 걸 볼 수 있다. 나중에는 입력과 출력이 큰 문제들을 마주하게 될 것인데, 미리 언급하고 가자면 iostream 입출력이 기본적으로 stdio의 입출력보다 느리다. 때문에 iostream 의 입출력도 빠르게 할 수 있는 방법도 있는데 이는 추후 천천히 문제들을 만나가면서 살펴보도록 하자.
- 정리
가장 기본적인 문제라 사실 정리할 건 별로 없었다. 그래서 백준의 문제 제출 시스템에 관해 간략히 알아보고 갔다.
첫 C++ 포스팅으로 백준의 단계별 풀어보기를 다룰 것인데, 아무래도 이미 Java로도 많은 문제들을 다루었기 때문에 알고리즘상의 큰 차이는 없는지라 내용이 중복될 수 있음을 미리 알려드리고자 한다.
다만 구현에서 각 언어가 지원하는 라이브러리들이 다르기 때문에 그 점에서 차이점이 있을 것이다.
마지막으로 필자가 매 번 포스팅하면서 올라온 코드들은 깃허브에도 올린다. 블로그 포스팅 외의 문제들도 있으니, 만약 빠르게 소스코드를 찾아보고 싶은 경우 아래 링크를 통해 보셔도 된다.
'C++ - 백준 [BAEK JOON] > 입출력과 사칙연산' 카테고리의 다른 글
[백준] 10998번 : A×B - [C++] (0) | 2021.02.13 |
---|---|
[백준] 1001번 : A-B - [C++] (0) | 2021.02.10 |
[백준] 1000번 : A+B - [C++] (0) | 2021.02.08 |
[백준] 10172번 : 개 - [C++] (0) | 2021.02.06 |
[백준] 10171번 : 고양이 - [C++] (4) | 2021.02.05 |