알고리즘/BOJ

알고리즘 - 백준 2741 (N 찍기)

꿀꺽람 2021. 8. 29. 21:50
반응형

문제 링크: https://www.acmicpc.net/problem/2741

 

2741번: N 찍기

자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

 

#include <iostream>
using namespace std;

int main() {
    int t;
    cin >> t;
    for (int i = 0; i < t; i++) {
        cout << i + 1 << endl;
    }
}

처음에는 이런 식으로 코드를 짰는데 계속 시간초과가 떴다. ㅠㅠ

구글링 결과 cin, cout이 C 표준 입출력 함수인 printf, scanf등에 비해 속도가 느리다는 것을 알게 되었다.

 

해결 방법

 

1) endl -> '\n'으로 바꾸기

endl의 경우 개행 문자를 출력하면서 출력 버퍼를 지우는 역할 까지 수행해서 딜레이가 발생 -> 시간 증가!!

따라서 '\n'을 통해 개행을 진행하는게 컴파일 시간을 줄이는 데에 효과적이다.

2) ios::sync_with_stdio(false);

ios::sync_with_stdio()는 C의 stdio와 C++의 iostream을 동기화시켜주는 역할을 한다.

동기화 과정에서 이 둘의 버퍼를 모두 사용해서 딜레이가 발생한다..

false로 설정해주어 동기화를 비활성화 시켜주면, C++ 만의 독립적인 버퍼가 생성된다. -> 실행 속도 빨라짐!!

근데 이거 멀티쓰레드에서는 안좋다.

동기화된 C++ 버퍼는 thread-safe해 I/O 순서가 예상과 일치하지만 동기화를 비활성화 시키면 멀티쓰레드 환경에서는 출력 순서가 엉망진창이 될 수 있음! 운영체제 수업 때 배운것 같기도,, ㅋㅋ..

근데 알고리즘 문제 풀 때는 대부분 싱글 쓰레드이기 때문에 큰 문제는 없을듯

글고 이거 쓰면 cin과 C의 scanf, getchar등등을 같이 쓰면 안되고 cout과 C의 printf 등등을 같이 쓰면 안됨!!

3) cin.tie(NULL);

cin과 cout의 묶음을 풀어준다.

등등의 방법들이 있었는데.. 그냥 C 표준 입출력 함수들을 사용하는 것도 하나의 방법이다.

 

소스 코드

 

#include <iostream>
using namespace std;

int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    for (int i = 0; i < t; i++)
        cout << i + 1 << '\n';
}
반응형