반응형
일반적으로 C++을 사용하면서 cin 표준입출력을 많이 사용했었다.
허나 다음과 같은 문제로 인해 scanf와 cin의 입출력 시간차이에 대해서 알게되었다.
//토마토_7576.cpp -시간초과 뜸
#include<iostream>
#include<queue>
using namespace std;
int inf[1001][1001];
int check[1001][1001];
int result = 0;
int m, n;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
void bfs(int x, int y) {
queue <pair<int, int>> q;
q.push(make_pair(x, y));
while (!q.empty()) {
x = q.front().first;
y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (0 <= nx && nx < n && 0 <= ny && ny < m) {
if (inf[nx][ny] == 0 && check[nx][ny] == 0) {
q.push(make_pair(nx, ny));
check[nx][ny] = check[x][y] + 1;
}
else if (inf[nx][ny] == 0 && check[nx][ny] != 0) {
if (check[nx][ny] > check[x][y] + 1) {
q.push(make_pair(nx, ny));
check[nx][ny] = check[x][y] + 1;
}
}
}
}
}
}
int main() {
cin >> m >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> inf[i][j];
check[i][j] = 0;
if (inf[i][j] == -1)
check[i][j] = -1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (inf[i][j] == 1 && check[i][j] == 0) {
check[i][j] = 0;
bfs(i, j);
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
result = max(result, check[i][j]);
if (inf[i][j] == 0 && check[i][j] == 0) {
cout << -1 << '\n';
return 0;
}
}
}
cout << result << '\n';
return 0;
}
위 코드는 BOJ의 토마토 문제로 bfs 알고리즘을 사용하여 해결하는 문제인데 시간초과가 발생한다.
코드상에는 문제가 없지만 왜 시간초과가 발생할까 고민했었는데 찾아보니 문제점은 입출력에 있었다.
위 도표를 보면 cin,cout은 편리하게 사용할 수 있었지만 생각보다 수행시간이 느렸다.
따라서 보완책으로 ios_base::sync_with_stdio(false)를 사용하지만 이또한 역시 추천하지 않는다.
알고리즘 문제를 풀 땐 C 표준 입출력 함수들을 사용하는 것이 좋다.
반응형
'개발(Dev) 이야기 > Algorithm' 카테고리의 다른 글
[BOJ] 미로탐색_2178 (0) | 2020.03.26 |
---|---|
[BOJ] BFS, DFS 구현 방법 (0) | 2020.03.22 |
[BOJ] 카잉달력_6064.cpp (0) | 2020.03.20 |
[BOJ] 리모컨_1107.cpp (0) | 2020.03.17 |
[BOJ] N과M(6)_15655.cpp (0) | 2020.03.17 |