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[] 배열에 안 담아도 되는지?
예를 들어 이런 상황이야:
이 경우는 입력받은 문자열을 즉시 처리하고, 다음 줄로 넘어가니까
굳이 배열에 따로 저장할 필요가 없어.
✅ 그럼 언제 String[] 배열을 쓰는 거야?
- 나중에 모든 입력을 다 모아서 한꺼번에 처리해야 할 때
- 예를 들어 출력할 결과를 line[]에 담았다가, System.out.println()으로 한 번에 출력한다거나
- 혹은 한 번에 데이터를 다 넘겨줘야 하는 함수가 있을 때
🎯 요약
- 즉시 처리한다 → String 하나로 충분
- 나중에 모아서 처리한다 → String[] 사용
바로 처리한다? 그러면 반복문을 돌면서 String line = br.readLine(); 에서 line에 각 문자열이 담기고 내가 적은 서비스 로직을 처리한 결과를 뱉는거야? 뱉은 다음에 다음 문자열을 또 로직 태우고?
🧠 즉, 이렇게 동작해:
- line = br.readLine(); → 입력 1줄 읽어옴
- line을 너가 만든 서비스 로직 (예: isVPS())에 넣어서 YES/NO 판단
- 결과 출력
- 다음 줄 읽고 또 판단
- 반복!
🔁 왜 배열이 필요 없는지?
line 변수 하나만으로도
"읽자마자 처리"하고 버리니까
굳이 String[]에 다 저장할 필요가 없는 거야.
💡 참고로…
만약 입력은 전부 받고,
출력은 나중에 한 번에 해야 되는 문제라면?
그땐 배열이나 List<String> 같은 데 저장해놔야지.
하지만 백준의 대부분 문제는
"입력 → 처리 → 출력"을 한 줄씩 반복해도 충분해!
그러면 readLine은 각 문자열을 어떻게 구분해서 아는거야? "()()()(" "(()))" 이걸 한 문자열로 볼 수도 있잖아. "" 큰따옴표로 구분된건가? 그럼 1 2 이렇게 정수형을 연달아 적으면 어떻게 되는데?
좋아, 이 질문 정말 핵심이야. 😎
BufferedReader.readLine()이 어떻게 문자열을 구분해서 읽는지 — 딱 집어줄게!
✅ readLine()은 어떻게 동작해?
이 코드는 입력에서 한 줄(line)을 통째로 문자열(String)로 읽어온다는 뜻이야.
📌 예시 1: 문자열 줄별 입력
입력이 이렇게 들어온다면:
그럼 코드 실행하면:
줄바꿈(Enter)이 입력 단위 기준이야.
큰따옴표(")는 문자열 구분자가 아님!!
즉, 네가 따옴표를 치지 않아도 자바는 한 줄을 하나의 문자열로 읽어들여.
✅ 숫자도 마찬가지야
입력이 이렇게 들어오면:
readLine()으로 읽으면 이렇게 돼:
즉, 숫자든 문자든 readLine()은 그냥 문자열로 읽어올 뿐이야.
공백은 포함한 문자열이기 때문에 직접 잘라줘야 해.
✂️ 그래서 숫자를 나누려면?
🧠 요약 정리
readLine() | "줄" 단위로 문자열 읽음 (줄바꿈이 구분자) |
공백 구분 | .split(" ") 등으로 직접 나눠야 함 |
큰따옴표 | 입력 구분에 전혀 상관 없음 (그냥 문자열 리터럴일 뿐) |
'코딩테스트 > etc' 카테고리의 다른 글
큐(Queue) (0) | 2025.05.16 |
---|---|
스택 (0) | 2025.05.08 |
배열의 시간 복잡도 (0) | 2025.04.10 |
코딩 테스트 필수 문법 (0) | 2025.04.09 |
시간 복잡도 (0) | 2025.04.09 |