포스트

[C++] 입력 처리

[C++] 입력 처리

C++ 알고리즘 문제 입력 방법 정리

1. cin 사용 (기본 입력)

1
2
int a, b;
cin >> a >> b;
  • C++ 표준 입력
  • 공백, 개행으로 구분된 값을 자동으로 읽음
  • 입력이 작거나 간단할 땐 충분히 빠름
  • 단점: scanf보다 약간 느림 (동기화 때문)

2. cin + ios::sync_with_stdio(false) + cin.tie(0)

1
2
ios::sync_with_stdio(false);
cin.tie(0);
  • C++의 cin과 C의 stdio를 동기화 해제
  • cin/cout 속도가 2~3배 빨라짐
  • printf와 cout을 혼용하면 안 됨
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
}

3. scanf / printf 사용 (C 방식)

1
2
int a, b;
scanf("%d %d", &a, &b);
  • C의 표준 입력/출력
  • cin보다 기본적으로 빠름
  • 포맷 지정자 필요
  • 문자열, 숫자 입력 혼용 시 주의

4. getline() 사용 (문자열 입력)

1
2
string s;
getline(cin, s);
  • 한 줄 전체 입력 받을 때 사용
  • cin으로 숫자 입력 후 getline 사용 시 개행 문자 주의 필요
1
2
3
4
int n;
cin >> n;
cin.ignore(); // 개행 무시
getline(cin, s);

5. fgets() + sscanf() (C 방식, 문자열 파싱)

1
2
3
char line[1000];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d %d", &a, &b);
  • 한 줄 입력 → 파싱 구조
  • getline보다 속도 빠름
  • 문자열 분해 후 값 추출에 유용

6. 파일 입출력 (디버깅/로컬 테스트)

1
2
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
  • 표준 입력/출력을 파일과 연결
  • 테스트케이스 저장 시 편리
  • 온라인 저지에서는 제출 시 제거 필요

7. cin.get() / cin.getline()

  • 한 글자씩 입력
  • 특정 구분자를 기준으로 읽기
  • 알고리즘 문제에서는 드물게 사용

속도 우선순위

일반적으로 입력 속도는 다음 순서로 빠름:

1
scanf > cin + sync_with_stdio(false) > cin
  • 입력 데이터 양이 많거나 시간 제한이 빡빡하면 ios::sync_with_stdio(false); cin.tie(0); 필수
  • 문자열 + 숫자 혼합 입력 → getline() + stringstream 조합 고려

추천 사용 상황

입력 방식추천 상황
cin작은 데이터, 간단한 문제
cin + sync대부분의 알고리즘 문제 (권장)
scanf매우 큰 입력, 속도 우선
getline한 줄 전체 입력
fgets + sscanf줄 단위 입력 + 포맷 파싱 필요

실전 예제

cin + sync_with_stdio(false) + tie(0) 조합

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    int n;
    cin >> n;
    while (n--) {
        int x;
        cin >> x;
        cout << x << '\n';
    }
}

getline + stringstream

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <sstream>
using namespace std;

int main() {
    string line;
    getline(cin, line);
    stringstream ss(line);
    int num;
    while (ss >> num) {
        cout << num << '\n';
    }
}

요약

  1. 기본 → cin
  2. 빠른 입력 → cin + ios::sync_with_stdio(false) + cin.tie(0)
  3. 문자열 → getline()
  4. 아주 빠른 입력 → scanf
  5. 문자열 파싱 → getline() + stringstream 또는 fgets() + sscanf()

대부분 문제는 sync_with_stdio(false) 조합이면 충분하며, 문자열 + 숫자 혼합 입력은 개행 문자 처리에 주의.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.