[백준] 2741번 : N 찍기 - [C++]
2741번: N 찍기
자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
www.acmicpc.net
- 문제
그리 어렵지 않은 문제다.
- 알고리즘 [접근 방법]
이 문제는 모두 쉽게 풀었을 것이다.
다만, 여러분들이 유의해야 할 점은 1부터 시작하여 N까지 출력해야 한다는점이다.
평소 버릇처럼 for문에서 for(int i = 0; i < N: i++) 으로 했다간 틀렸습니다를 받게 될 것이다. (항상 문제를 잘 읽는 것이 중요하다.)
그리고 직전 문제를 풀어보았다면 알겠지만, 조금 더 빠른 입출력을 위한 방법을 이용하면 좀 더 성능 좋은 결과를 얻을 수 있다.
해당 글은 아래 글을 참고하시길 바란다.
[백준] 15552번 : 빠른 A+B - [C++]
www.acmicpc.net/problem/15552 15552번: 빠른 A+B 첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다. www.acmi..
st-lab.tistory.com
- 2가지 방법을 사용하여 풀이한다.
일반적인 cin, cout 방식과 iostream을 개선한 cin, cout 방식 두 가지 입출력 방법을 통해 성능을 비교해보려 한다.
1. 일반적인 방법
2. iostream 개선 방법
- 풀이
- 방법 1 : [일반적인 방법]
#include <iostream>
using namespace std;
int main(int argc, char const *argv[]) {
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
cout << i << "\n";
}
return 0;
}
가장 기본적인 방법이라 할 수 있겠다.
알고리즘 설명에서 참고하라는 포스팅에서도 말했지만 std::endl 는 단순히 개행만 하는 것이 아닌 버퍼를 비우는 작업도 같이 하기 때문에 "\n"을 사용해주는 것이 알고리즘 풀이에서는 좋다.
만약 endl; 을 쓸 경우 시간초과를 얻게 된다.
- 방법 2 : [iostream 개선 방법]
기본적으로 C++ 표준스트림은 C 표준 스트림과 동기화가 되어있기 때문에 이를 끊어주는 것이 좋다.
즉, sync_with_stdio()에 false 로 인자를 넘겨 두 스트림의 동기화를 끊어주는 것이다.
#include <iostream>
using namespace std;
int main(int argc, char const *argv[]) {
ios_base::sync_with_stdio(false);
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
cout << i << "\n";
}
return 0;
}
여기서 왜 cin.tie(NULL) 이나 cout.tie(NULL) 을 사용하지 않냐고 질문이 올 수 있다.
하지만 잘 생각해보면, tie()는 '입력과 출력' 연결을 끊어주는 것이다.
쉽게 말하자면 cin 입력이 들어오면 자동적으로 출력 버퍼를 비우게 된다는 것이다.
즉, 입출력이 반복적으로 있을 때엔 위 연결을 끊어주는 것이 맞지만, 이 문제에서는 처음 입력이 들어오고 이 후 출력만 존재한다.
입력과 출력이 번갈아가면서 사용하는 것이 아니기 때문에 서로 연결을 끊어주어도 의미가 없다. 즉 쓸 필요가 없다는 뜻이다.
여러분들이 cin.tie(NULL); 이나 cout.tie(NULL)을 삽입하여 제출하더라도 위 코드와 성능 결과가 같게 나올 것이다.
- 성능
채점 번호 : 28094780 - 방법 2
채점 번호 : 28094772 - 방법 1
보면 C++와 C 표준스트림 동기화를 끊어준 것이 좀 더 빠른 시간이 보이는 것을 확인할 수 있다. (사실 그렇게 큰 유의미한 차이는 아니지만..)
- 정리
이 번 문제 또한 어려운 점은 없었을 것이다.
다만, endl 의 역할이 무엇인지, sync_with_stdio() 은 무슨 역할을 하는지 입출력에 대한 구조를 이해한다면 좀 더 좋은 성능을 낼 수 있다는 것을 알 수 있는 문제다.
물론 scanf(), printf()을 써도 무방하나 C++에서는 최대한 C++ 표준 라이브러리를 이용하여 쓸 것이니, 만약 C를 배웠던 분이라면 굳이 위처럼 하지 않아도 무방하며 여러분이 편한 문법을 선택하면 된다.
'C++ - 백준 [BAEK JOON] > 기타 문제' 카테고리의 다른 글
[백준] 2577번 : 숫자의 개수 - [C++] (0) | 2021.09.27 |
---|---|
[백준] 2742번 : 기찍 N - [C++] (0) | 2021.04.12 |
[백준] 10718번 : We love kriii - [C++] (0) | 2021.02.04 |