
1. 문제 분석
1) 영어 대소문자 + 공백으로 이루어진 문자열이 주어진다.
2) 단어는 공백으로 구분된다.
3) 단어의 개수를 세서 출력한다.
4) 문자열의 처음과 끝에 공백이 들어갈 수 있다.
2. 제약 조건
문자열의 길이 <= 1,000,000
3. 의사결정
1) 문자열 S를 입력받는다.
2) StringTokenizer를 사용해 공백 기준으로 분리한다.
4) 토큰 길이를 출력한다.
4. 문제 해결
1) countTokens() : StringTokenizer가 가지고 있는 토큰의 개수 반환
2) split()은 무조건 하나 이상의 배열을 출력하기 때문에 문자열에 공백만 있을 경우 1을 반환하지만
StringTokenizer의 경우 0을 반환하기 때문에 더 적절하다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
System.out.println(st.countTokens());
}
}
더 줄여봤다. 가독성은 조금 떨어지지만 한줄로도 가능했다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
System.out.println(new StringTokenizer(new BufferedReader(new InputStreamReader(System.in)).readLine()).countTokens());
}
}
이 문제도 10개월 전에 풀었던 것과 비교하면 메모리와 시간이 반 이상 줄었다.

오늘 풀이한 방법 두 가지 코드 간의 메모리, 시간 차이는 별로 없었다.
| 20291. 파일 정리 (2) | 2024.11.15 |
|---|---|
| 2908. 상수 (0) | 2024.11.15 |
| 26041. 비슷한 전화번호 표시 (1) | 2024.11.15 |
| 2675. 문자열 반복 (0) | 2024.11.15 |
| 메모이제이션(Memoization) (0) | 2024.11.14 |