RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
← 브론즈 V

입력

표준 입력에서 값을 읽는 방법 — cin, input().

기초 & 구현 Bronze V 브론즈 V
1강 입력 기초: cin · scanf · input 공식

입력이란?

대부분의 문제는 표준 입력(standard input) 으로 데이터를 받습니다. 키보드로
직접 치는 대신, 채점기가 미리 준비한 입력을 프로그램에 흘려 넣어 줍니다.


1. 정수 한 개 / 여러 개 읽기

C++

#include <bits/stdc++.h>
using namespace std;
int main() {
    int a, b;
    cin >> a >> b; // 공백·줄바꿈으로 구분된 두 정수
    cout << a + b << '\n';
}

Python

a, b = map(int, input().split())
print(a + b)

cin >>은 공백과 줄바꿈을 알아서 건너뛰며 값을 읽습니다. 파이썬의
input()은 한 줄을 통째로 읽으므로, split()으로 자르고 map(int, ...)
정수로 바꿔 줍니다.


2. 정해진 개수(N개) 읽기

int n;
cin >> n;
long long sum = 0;
for (int i = 0; i < n; i++) {
    int x; cin >> x;
    sum += x;
}
cout << sum << '\n';
n = int(input())
nums = list(map(int, input().split())) # 한 줄에 N개가 주어질 때
print(sum(nums))

3. 한 줄짜리 문자열 / 끝까지 읽기

띄어쓰기가 포함된 한 줄을 통째로 읽을 땐:

string line;
getline(cin, line); // 줄 전체(공백 포함)를 읽는다

입력이 몇 줄인지 모를 때(EOF까지):

int x;
while (cin >> x) { // 더 읽을 게 없으면 반복 종료
    // x 처리
}
import sys
for line in sys.stdin: # 줄 단위로 끝까지
    x = int(line)
    # x 처리

4. cin >> 다음 getline을 쓸 때 주의

int n; cin >> n;
cin.ignore(); // 줄바꿈 하나를 버려야 함!
string s; getline(cin, s);

cin >> n은 숫자만 읽고 줄바꿈을 입력 버퍼에 남깁니다. 곧바로
getline을 부르면 빈 줄이 읽히므로, 사이에 cin.ignore();를 넣으세요.


5. 자주 하는 실수

  • 입력 형식 무시 — "첫 줄에 N, 둘째 줄에 N개의 수"인데 한 줄에서 다 읽으려다 틀리는 경우. 문제의 입력 형식을 그대로 따라가세요.
  • 숫자/문자 혼합 입력에서 줄바꿈 처리 — 위 4번의 cin.ignore() 문제.
  • 느린 입력 — 수가 수십만 개면 cin도 느려질 수 있습니다. 다음 글 빠른 입출력을 보세요.

연습 팁

입력을 읽기 전에 문제의 입력 형식을 손으로 적어 보세요. "몇 줄? 각 줄에
몇 개? 정수인가 문자열인가?" 이 세 가지만 정리하면 입력 코드는 거의 기계적으로
나옵니다.

2강 입력 형식을 정확히 읽는 법 공식

입력 형식 읽기가 절반이다

Bronze에서 틀리는 흔한 이유는 알고리즘이 아니라 입력을 잘못 읽는 것입니다.
문제의 "입력" 부분을 정확히 그림으로 그릴 수 있어야 합니다.


1. 줄 구조를 파악하라

문제마다 입력이 "몇 줄에 무엇이 있는지"가 다릅니다. 예를 들어:

첫 줄: N
둘째 줄: N개의 정수 (공백 구분)

이 구조는 이렇게 읽습니다.

int n;
cin >> n;
for (int i = 0; i < n; i++) {
    int x; cin >> x;
    // x 처리
}
n = int(input())
arr = list(map(int, input().split()))

C++의 cin >>는 공백·줄바꿈을 가리지 않고 다음 수를 알아서 읽으므로 줄 구조에
덜 민감하지만, 파이썬은 줄 단위input()을 줄 수만큼 정확히 불러야 합니다.


2. 테스트 케이스가 여러 개일 때

첫 줄: T (테스트 개수)
이후 T줄: 각 줄에 a b
int t; cin >> t;
while (t--) {
    int a, b; cin >> a >> b;
    cout << a + b << '\n';
}
t = int(input())
for _ in range(t):
    a, b = map(int, input().split())
    print(a + b)

while (t--)는 t를 한 번 쓰고 1 줄이는 흔한 관용구입니다.


3. 개수를 안 알려줄 때 (EOF까지)

입력이 몇 줄인지 안 주고 "파일 끝까지"인 경우가 있습니다.

int a, b;
while (cin >> a >> b) {    // 더 읽을 게 없으면 false
    cout << a + b << '\n';
}
import sys
for line in sys.stdin:
    a, b = map(int, line.split())
    print(a + b)

4. 공백 있는 한 줄 통째로 읽기

이름이나 문장처럼 공백이 포함된 한 줄getline(C++) / input()(파이썬)으로 읽습니다.

string line;
getline(cin, line);   // 줄 전체를 공백째로

주의: cin >> n 다음에 getline을 쓰면 남은 줄바꿈이 먼저 읽혀 빈 줄이 됩니다.
사이에 cin.ignore();를 넣으세요.


정리

문제의 입력 설명을 읽으며 "몇 줄? 각 줄에 몇 개? 구분자는 공백인가 줄바꿈인가?"
이 세 가지를 메모하세요. 이것만 정확하면 입력 부분은 기계적으로 작성됩니다.

3강 입력 처리 실전 패턴 공식

자주 나오는 입력 패턴 모음

실전에서 마주치는 입력 형태는 몇 가지로 정해져 있습니다. 손에 익혀 두면
문제를 보자마자 입력 코드를 바로 적을 수 있습니다.


1. 2차원 격자 읽기

첫 줄: N M
이후 N줄: 각 줄에 M개의 수
int n, m;
cin >> n >> m;
int grid[100][100];
for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
        cin >> grid[i][j];
n, m = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]

2. 붙어 있는 숫자/문자 격자

칸 사이에 공백이 없이 10110처럼 붙어 있는 경우가 많습니다.

int n; cin >> n;
int grid[100][100];
for (int i = 0; i < n; i++) {
    string row; cin >> row;          // 한 줄을 문자열로 읽고
    for (int j = 0; j < n; j++)
        grid[i][j] = row[j] - '0';   // 문자 '0'~'9'를 숫자로
}
n = int(input())
grid = [list(map(int, input())) for _ in range(n)]
# input() 한 줄을 글자 단위로 쪼개 int로 변환

문자 '0'을 숫자 0으로 바꾸려면 문자 - '0'을 합니다. 아스키 코드 원리예요.


3. 파이썬에서 빠르게 읽기

입력이 많으면 파이썬 input()은 느립니다. sys.stdin을 쓰세요.

import sys
input = sys.stdin.readline   # input을 빠른 버전으로 교체

n = int(input())
for _ in range(n):
    a, b = map(int, input().split())
    print(a + b)

readline은 줄 끝 \n까지 읽으므로, 문자열을 그대로 비교할 땐 .rstrip()으로
줄바꿈을 떼어 주는 게 안전합니다.


4. 자주 하는 실수

  • 줄 수 착각 — N줄을 읽어야 하는데 한 번만 input()을 부른 경우.
  • split 빠뜨림 — 한 줄에 여러 수가 있는데 int(input())으로 통째 변환 시도.
  • 남은 줄바꿈cin >> n 직후 getline 전에 cin.ignore() 누락.

정리

입력 패턴은 (1) N개 수열, (2) 2차원 격자, (3) 붙은 글자 격자, (4) EOF까지 —
이 네 가지가 대부분입니다. 각각의 코드 틀을 통째로 외워 두면 입력에서 시간을
거의 쓰지 않게 됩니다.