
한 문장 요약: 하나의 긴 문자열을 공백 기준으로 잘라서, 필요할 때마다 하나씩 꺼내 쓸 수 있게 해주는 도구
원본: "20 10 35 30 7"
↓ (공백 기준 분리)
토큰: ["20", "10", "35", "30", "7"]
// Scanner (가장 느림)
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
// split() (배열 생성 - 메모리 사용)
String[] arr = line.split(" ");
int a = Integer.parseInt(arr[0]);
// StringTokenizer (가장 빠름)
StringTokenizer st = new StringTokenizer(line);
int a = Integer.parseInt(st.nextToken());
결론: 대용량 입력에서는 StringTokenizer가 가장 빠르고 효율적
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine(); // "20 10 35 30 7" 전체를 읽음
StringTokenizer st = new StringTokenizer(line);
// 내부적으로 ["20", "10", "35", "30", "7"]로 분리됨
String token1 = st.nextToken(); // "20"
String token2 = st.nextToken(); // "10"
String token3 = st.nextToken(); // "35"
// ... 순서대로 하나씩 반환
StringTokenizer = 과자 상자
상자를 열면: [🍪 🍪 🍪 🍪 🍪]
nextToken() = 과자 하나 꺼내기
1회 호출: 🍪 (첫 번째)
2회 호출: 🍪 (두 번째)
3회 호출: 🍪 (세 번째)
...
한 번 꺼낸 과자는 다시 넣을 수 없음!
| 메소드 | 설명 | 반환 타입 |
|---|---|---|
nextToken() | 다음 토큰을 꺼내서 반환 | String |
hasMoreTokens() | 토큰이 남아있는지 확인 | boolean |
countTokens() | 남은 토큰 개수 반환 | int |
StringTokenizer st = new StringTokenizer("1 2 3 4 5");
System.out.println(st.countTokens()); // 5
System.out.println(st.nextToken()); // "1"
System.out.println(st.hasMoreTokens()); // true
System.out.println(st.countTokens()); // 4 (하나 꺼냈으니)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
System.out.println(A + B);
입력 예시: 10 20
출력: 30
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
입력 예시:
5
1 4 1 2 4
StringTokenizer st = new StringTokenizer(br.readLine());
while (st.hasMoreTokens()) {
int num = Integer.parseInt(st.nextToken());
// 처리 로직
}
StringTokenizer st = new StringTokenizer(br.readLine());
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
while (st.hasMoreTokens()) {
int num = Integer.parseInt(st.nextToken());
if (num < min) min = num;
if (num > max) max = num;
}
System.out.println(min + " " + max);
입력 예시: 20 10 35 30 7
출력: 7 35
String line = "1 2 3 4 5";
String[] arr = line.split(" ");
// 배열로 전부 저장됨
int a = Integer.parseInt(arr[0]); // 인덱스 접근
int b = Integer.parseInt(arr[1]);
int c = Integer.parseInt(arr[2]);
특징:
String line = "1 2 3 4 5";
StringTokenizer st = new StringTokenizer(line);
// 순서대로 하나씩만 꺼냄
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
특징:
StringTokenizer st = new StringTokenizer("1 2 3");
st.nextToken(); // "1"
st.nextToken(); // "2"
// "1"로 다시 돌아갈 수 없음!
StringTokenizer st = new StringTokenizer("1 2");
st.nextToken(); // "1"
st.nextToken(); // "2"
st.nextToken(); // ❌ NoSuchElementException 발생!
해결책: hasMoreTokens()로 먼저 확인
while (st.hasMoreTokens()) {
String token = st.nextToken(); // ✅ 안전
}
// 기본: 공백으로 구분
StringTokenizer st1 = new StringTokenizer("1 2 3");
// 콤마로 구분
StringTokenizer st2 = new StringTokenizer("1,2,3", ",");
// 여러 구분자 사용
StringTokenizer st3 = new StringTokenizer("1,2:3;4", ",:;");
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 줄: N 입력
int N = Integer.parseInt(br.readLine());
// 둘째 줄: N개의 숫자 입력
StringTokenizer st = new StringTokenizer(br.readLine());
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(st.nextToken());
if (num < min) min = num;
if (num > max) max = num;
}
System.out.println(min + " " + max);
br.close();
}
}
입력:
5
20 10 35 30 7
출력:
7 35