코딩테스트/etc

BuilderedReader로 입력값 받을 때 의문점 (feat.GPT)

soooy0 2025. 5. 16. 17:08

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

br에는 어떤 데이터가 들어가있어?

 

br은 우리가 BufferedReader로 만든 입력 객체야. 즉, br 자체는 **표준 입력(키보드 입력 또는 백준에서는 테스트 데이터)**을 한 줄씩 읽어오는 입력 도구라고 생각하면 돼.



🔍 예를 들어서 보면:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

이 줄은 이렇게 해석돼:

System.in → 표준 입력 (기본적으로 키보드 입력 또는 백준 입력) InputStreamReader → 바이트를 문자로 바꿔줌 BufferedReader → 한 줄 전체를 읽을 수 있도록 버퍼링해서 처리 속도 빠르게 해줌



📦 실제로 br.readLine()을 쓰면 어떤 일이 일어나?

예를 들어 입력이 이렇게 들어온다고 해봐:

3
(())
()()
((())

그럼 이 코드:

int T = Integer.parseInt(br.readLine()); // "3" → 정수 3으로 변환
String s = br.readLine(); // "(()" 읽음

br.readLine()은 입력에서 **한 줄(String)**을 가져오는 거야. br 자체는 "지금 입력 대기 중인 상태"를 관리하고 있어.

 

"(())())" "(((()())()" "(()())((()))" 이렇게 입력한다고 했을 때, 각 한줄씩 읽기 때문에 int T = 3이 되는거고,
근데 그러면 String[] 배열에 담아야 하는거 아니야? 왜 그냥 String 변수를 사용하지?

 

결론부터 말하면:
반복문 안에서 String 변수 하나만 써도 되기 때문이야.


🔍 왜 String[] 배열에 안 담아도 되는지?

예를 들어 이런 상황이야:

for (int i = 0; i < T; i++) { String line = br.readLine(); // 여기서 line을 바로 처리함 }

이 경우는 입력받은 문자열을 즉시 처리하고, 다음 줄로 넘어가니까
굳이 배열에 따로 저장할 필요가 없어.


✅ 그럼 언제 String[] 배열을 쓰는 거야?

  • 나중에 모든 입력을 다 모아서 한꺼번에 처리해야 할 때
  • 예를 들어 출력할 결과를 line[]에 담았다가, System.out.println()으로 한 번에 출력한다거나
  • 혹은 한 번에 데이터를 다 넘겨줘야 하는 함수가 있을 때
inputs = new String[T]; for (int i = 0; i < T; i++) { inputs[i] = br.readLine(); } // 나중에 한꺼번에 처리할 때 유용

🎯 요약

  • 즉시 처리한다 → String 하나로 충분
  • 나중에 모아서 처리한다 → String[] 사용

 

바로 처리한다? 그러면 반복문을 돌면서 String line = br.readLine(); 에서 line에 각 문자열이 담기고 내가 적은 서비스 로직을 처리한 결과를 뱉는거야? 뱉은 다음에 다음 문자열을 또 로직 태우고?

🧠 즉, 이렇게 동작해:

  1. line = br.readLine(); → 입력 1줄 읽어옴
  2. line을 너가 만든 서비스 로직 (예: isVPS())에 넣어서 YES/NO 판단
  3. 결과 출력
  4. 다음 줄 읽고 또 판단
  5. 반복!

🔁 왜 배열이 필요 없는지?

line 변수 하나만으로도
"읽자마자 처리"하고 버리니까
굳이 String[]에 다 저장할 필요가 없는 거야.


💡 참고로…

만약 입력은 전부 받고,
출력은 나중에 한 번에 해야 되는 문제라면?
그땐 배열이나 List<String> 같은 데 저장해놔야지.

하지만 백준의 대부분 문제는
"입력 → 처리 → 출력"을 한 줄씩 반복해도 충분해!

 

그러면 readLine은 각 문자열을 어떻게 구분해서 아는거야? "()()()(" "(()))" 이걸 한 문자열로 볼 수도 있잖아. "" 큰따옴표로 구분된건가? 그럼 1 2 이렇게 정수형을 연달아 적으면 어떻게 되는데?

좋아, 이 질문 정말 핵심이야. 😎
BufferedReader.readLine()이 어떻게 문자열을 구분해서 읽는지 — 딱 집어줄게!


✅ readLine()은 어떻게 동작해?

 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = br.readLine();

이 코드는 입력에서 한 줄(line)을 통째로 문자열(String)로 읽어온다는 뜻이야.


📌 예시 1: 문자열 줄별 입력

입력이 이렇게 들어온다면:

 
()()()( (()))

그럼 코드 실행하면:

 
String line1 = br.readLine(); // "()()()(" String line2 = br.readLine(); // "(()))"

줄바꿈(Enter)이 입력 단위 기준이야.
큰따옴표(")는 문자열 구분자가 아님!!
즉, 네가 따옴표를 치지 않아도 자바는 한 줄을 하나의 문자열로 읽어들여.


✅ 숫자도 마찬가지야

입력이 이렇게 들어오면:

 
1 2 3 4 5 6

readLine()으로 읽으면 이렇게 돼:

 
String line1 = br.readLine(); // "1 2 3" String line2 = br.readLine(); // "4 5 6"

즉, 숫자든 문자든 readLine()은 그냥 문자열로 읽어올 뿐이야.
공백은 포함한 문자열이기 때문에 직접 잘라줘야 해.


✂️ 그래서 숫자를 나누려면?

 
String line = br.readLine(); // 예: "1 2 3" String[] parts = line.split(" "); // 공백 기준으로 나눔 int a = Integer.parseInt(parts[0]); // 1 int b = Integer.parseInt(parts[1]); // 2

🧠 요약 정리

상황결과
readLine() "줄" 단위로 문자열 읽음 (줄바꿈이 구분자)
공백 구분 .split(" ") 등으로 직접 나눠야 함
큰따옴표 입력 구분에 전혀 상관 없음 (그냥 문자열 리터럴일 뿐)

'코딩테스트 > etc' 카테고리의 다른 글

큐(Queue)  (0) 2025.05.16
스택  (0) 2025.05.08
배열의 시간 복잡도  (0) 2025.04.10
코딩 테스트 필수 문법  (0) 2025.04.09
시간 복잡도  (0) 2025.04.09