[백준] 2742번 : 기찍 N - [C++]
2742번: 기찍 N
자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
www.acmicpc.net
- 문제
바로 직전 문제인 N찍기를 반대로만 하면 되는 문제다.
- 알고리즘 [접근 방법]
이 문제는 모두 쉽게 풀었을 것이다.
직전 문제인 N 찍기 문제를 풀었다면야 바로 거꾸로만 하면 되기 때문에...
유의해야 할 점은 N부터 시작하여 1까지 출력해야 한다는점이다. 이 점만 주의하여 풀면 된다.
그리고 직전 문제를 풀어보았다면 알겠지만, 조금 더 빠른 입출력을 위한 방법을 이용하면 좀 더 성능 좋은 결과를 얻을 수 있다.
해당 글은 아래 글을 참고하시길 바란다.
[백준] 2741번 : N 찍기 - [C++]
www.acmicpc.net/problem/2741 2741번: N 찍기 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 그리 어렵지 않은 문제다. 알고리즘 [접근 방법] 이..
st-lab.tistory.com
이전의 N찍기는 1~N까지 1씩 증가시켜 for문을 반복해줬다면 기찍N은 그 반대로 하면 되기 때문에 초기식 및 조건식과 증감식만 거꾸로 해주면 된다.
쉽게 코드로 보자면 다음과 같다.
// N찍기
for (int i = 1; i <= N; i++) { // 1부터 1씩 증가
cout << i << "\n";
}
//기찍N
for (int i = N; i > 0; i--) { // N부터 1씩 감소
cout << i << "\n";
}
- 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 = N; i > 0; i--) {
cout << i << "\n";
}
return 0;
}
가장 기본적인 방법이라 할 수 있겠다.
직전 포스팅에서도 말했지만 std::endl 는 단순히 개행만 하는 것이 아닌 버퍼를 비우는 작업도 같이 하기 때문에 "\n"을 사용해주는 것이 알고리즘 풀이에서는 좋다.
- 방법 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 = N; i > 0; i--) {
cout << i << "\n";
}
return 0;
}
여기서 cin.tie(NULL) 이나 cout.tie(NULL)은 쓸 필요가 없다.
하지만 잘 생각해보면, tie()는 '입력과 출력' 연결을 끊어주는 것이다.
쉽게 말하자면 cin 입력이 들어오면 자동적으로 출력 버퍼를 비우게 된다는 것이다.
즉, 입출력이 반복적으로 있을 때엔 위 연결을 끊어주는 것이 맞지만, 이 문제에서는 처음 입력이 들어오고 이 후 출력만 존재한다.
입력과 출력이 번갈아가면서 사용하는 것이 아니기 때문에 서로 연결을 끊어주어도 의미가 없다. 즉 쓸 필요가 없다는 뜻이다.
여러분들이 cin.tie(NULL); 이나 cout.tie(NULL)을 삽입하여 제출하더라도 위 코드와 성능 결과가 같게 나올 것이다.
- 성능
채점 번호 : 28283603 - 방법 2
채점 번호 : 28283594 - 방법 1
보면 C++와 C 표준스트림 동기화를 끊어준 것이 좀 더 빠른 시간이 보이는 것을 확인할 수 있다. (사실 그렇게 큰 유의미한 차이는 아니지만..)
- 정리
이전 문제와 다른게 크게 없는 문제라 어려운 점은 없었을 것이다.
다만, endl 의 역할이 무엇인지, sync_with_stdio() 은 무슨 역할을 하는지 입출력에 대한 구조를 이해한다면 좀 더 좋은 성능을 낼 수 있다는 것을 알 수 있는 문제다.
물론 scanf(), printf()을 써도 무방하나 C++에서는 최대한 C++ 표준 라이브러리를 이용하여 쓸 것이니, 만약 C를 배웠던 분이라면 굳이 위처럼 하지 않아도 무방하며 여러분이 편한 문법을 선택하면 된다.
'C++ - 백준 [BAEK JOON] > 기타 문제' 카테고리의 다른 글
[백준] 2577번 : 숫자의 개수 - [C++] (0) | 2021.09.27 |
---|---|
[백준] 2741번 : N 찍기 - [C++] (0) | 2021.04.06 |
[백준] 10718번 : We love kriii - [C++] (0) | 2021.02.04 |