경쟁 프로그래밍이나 코딩 테스트에서는 대용량의 테스트 데이터를 빠르게 처리해야 하는 경우가 많습니다. 이럴 때 표준 입력 대신 외부 파일로부터 입력을 받고, 실행 결과를 파일에 출력하는 방법을 알아두면 테스트와 디버깅이 훨씬 수월해집니다. 이 글에서는 C/C++, Java, Python 세 가지 언어에서 외부 파일 입출력을 처리하는 방법을 예제 코드와 함께 자세히 살펴보겠습니다.
Python에서 파일 입출력 처리하기
Python에서는 sys 모듈을 활용하면 아주 간단하게 표준 입력(stdin)과 표준 출력(stdout)을 파일로 교체할 수 있습니다. 별도의 복잡한 설정 없이 단 두 줄만 추가하면 되기 때문에, 시간 제한이 타이트한 온라인 저지 문제에서 특히 유용합니다.
예제 코드
import sys
# 파일로부터 입력 받기
sys.stdin = open('sampleinp.txt', 'r')
# 파일로 출력하기
sys.stdout = open('sampleout.txt', 'w')위 코드처럼 sys.stdin을 파일 객체로 바꾸면 input() 함수가 파일에서 데이터를 읽고, sys.stdout을 교체하면 print()의 결과가 파일에 저장됩니다. 참고로 입력 파일과 출력 파일은 서로 다른 이름으로 사용하는 것이 안전합니다.
Java에서 파일 입출력 처리하기
Java에서는 BufferedReader와 FileReader를 조합하여 파일에서 입력을 읽고, PrintWriter와 BufferedWriter, FileWriter를 조합하여 파일에 출력합니다. 버퍼링을 활용하기 때문에 대량의 데이터를 처리할 때도 성능 저하 없이 빠른 입출력이 가능합니다.
예제 코드
// Java 프로그램: 파일 입출력 처리
import java.io.*;
class Input {
public static void main(String[] args) throws IOException {
// 파일에서 입력 읽기
BufferedReader br = new BufferedReader(
new FileReader("sampleinp.txt"));
// 파일에 출력 쓰기
PrintWriter pw = new PrintWriter(
new BufferedWriter(
new FileWriter("sampleout.txt")));
pw.flush();
}
}작업이 끝난 후에는 반드시 pw.flush() 또는 pw.close()를 호출해야 버퍼에 남아 있는 데이터가 파일에 온전히 기록됩니다.
C/C++에서 파일 입출력 처리하기
C/C++에서는 freopen() 함수를 사용합니다. 이 함수는 기존의 표준 스트림을 지정한 파일과 연결해 주며, 두 번째 인자로 파일 모드를 지정합니다. "r"은 읽기 모드, "w"는 쓰기 모드를 의미합니다.
예제 코드
#include <stdio.h>
int main() {
// 파일로부터 입력 받기
freopen("sampleinp.txt", "r", stdin);
// 파일로 출력하기
freopen("sampleout.txt", "w", stdout);
return 0;
}freopen()으로 스트림을 재지정하면 이후에는 일반적인 scanf, printf(또는 C++의 cin, cout)을 그대로 사용할 수 있으므로, 기존 코드를 거의 수정하지 않고도 파일 입출력으로 전환할 수 있다는 장점이 있습니다.
마무리
지금까지 경쟁 프로그래밍에서 유용하게 활용할 수 있는 C/C++, Java, Python의 외부 파일 입출력 방법을 알아보았습니다. 세 언어 모두 몇 줄의 코드만 추가하면 되므로, 대량의 테스트 데이터를 반복적으로 검증해야 할 때 적극적으로 활용해 보시기 바랍니다. 파일 입출력에 익숙해지면 문제 풀이 집중력과 디버깅 효율이 모두 크게 향상될 것입니다.