[C++] 백준 20단계 - 18258번 문제 (큐 2)자료구조 & 알고리즘/BOJ2023. 7. 10. 18:06
Table of Contents
문제설명
소스코드
#include <iostream>
#include <queue>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); //표준 스트림 동기화 해제
cin.tie(NULL); //입력과 출력 연결 끊기
queue<int> que;
string command;
int N;
cin >> N;
for (int i = 0; i < N; ++i)
{
cin >> command;
if (command == "push")
{
int X;
cin >> X;
que.push(X);
}
else if (command == "pop")
{
if (que.empty()) cout << "-1" << '\n';
else
{
cout << que.front() << '\n';
que.pop();
}
}
else if (command == "front")
{
if (que.empty()) cout << "-1" << '\n';
else cout << que.front() << '\n';
}
else if (command == "back")
{
if (que.empty()) cout << "-1" << '\n';
else cout << que.back() << '\n';
}
else if (command == "size") cout << que.size() << '\n';
else if (command == "empty") cout << que.empty() << '\n';
else if (command == "top")
{
if (que.empty()) cout << "-1" << '\n';
else cout << que.front() << '\n';
}
}
}
풀이
시간제한이 C / C++기준으로 1초이기 때문에 아래의 과정을 수행해야한다.
- C와 C++과의 표준 스트림 동기화 해제
- 입력과 출력 연결 해제
- endl 대신 \n 쓰기
cout(출력) cin(입력)과의 묶인것을 해제시키지 않고, C와 C++과의 입출력 동기화를 해제하지 않으면 이 문제는 틀리게 된다.
기본적으로 C++에서는 C의 표준 스트림이 동기화가 되어있다.
C와 C++가 동일한 버퍼를 공유한다는 말이다.
이러한 동기화는 성능을 저하시키지만 스레드로부터 안전하기 때문에 동기화 상태로 두는 것이 더 좋긴 하다.
하지만 알고리즘 문제풀이 또는 예외처리나 멀티스레드 작업을 필요로 하지 않는 작업에서는 동기화를 끊어주면 속도가 빨라진다.
(C++ 표준 스트림이 독립적으로 IO(intput, output)버퍼링을 할 수 있다는 것이다. 이렇게 되면 상당히 많은 양의 입출력이 있을 경우 동기화되어있는 상태에 비해 성능이 많이 좋아진다.)
endl은 단순히 줄 바꿈만 해주는 것이 아니라 출력 버퍼를 비우는 역할까지 한다.
매 줄 바꿈마다 endl을 쓰면 입출력을 끊어주는 효과를 볼 수 없다.
데이터 버퍼링
버퍼링이란 전송률이 서로 다른 장치 간에 주고받는 데이터를 버퍼(buffer)라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법이다. 쉽게 말해 버퍼링은 버퍼에 데이터를 조금씩 모았다가 한꺼번에 내보내거나, 데이터를 한 번에 많이 받아 조금씩 내보내는 방법이라고 보면 된다.
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[C++] 백준 12단계 - 1436번 문제 (영화감독 숌) (0) | 2023.07.11 |
---|---|
[C++] 백준 12단계 - 19532번 문제 (수학은 비대면강의입니다) (0) | 2023.07.10 |
[C++] 백준 - 10845번 문제 (큐) (0) | 2023.06.26 |
[C++] 백준 6단계 - 4344번 문제 (평균은 넘겠지) (0) | 2023.06.26 |
[C++] 백준 12단계 - 2231번 문제 (분해합) (0) | 2023.06.25 |