일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
Archives
will come true
[BOJ] 백준 1152 번 - 단어의 개수 (Java) 본문
728x90
문제
https://www.acmicpc.net/problem/1152
1152번: 단어의 개수
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열
www.acmicpc.net
코드
A. StringTokenizer를 사용하는 방법
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
StringTokenizer st = new StringTokenizer(s, " ");
System.out.print(st.countTokens());
}
}
- java.util.StringTokenizer 클래스
- 긴 문자열을 지정된 구분자를 기준으로 코튼(token)이라는 여러 개의 문자열로 잘라낸다.
- 단, 구분자로 단 하나의 문자 밖에 사용하지 못한다.
- 구분자를 토큰으로 간주할지 여부는 생성자의 3번째 매개변수(boolean)로 설정할 수 있다.
- countTokens() : 전체 토큰의 수를 반환한다.
B. split() 메서드를 사용하는 방법
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
// 공백, 빈문자열 체크
if(s.isEmpty() || s.equals(" ")) {
System.out.println(0);
} else {
// 앞뒤 공백 제거, 공백 한칸으로 분할
String[] word = s.trim().split(" ");
System.out.println(word.length);
}
}
}
- String[] split(String regex) 메서드
- 문자열을 지정된 구분자으로 나누어 문자열 배열에 담아 반환한다.
- StringTokenizer와 달리 구분자로 정규식 표현(regular expression)을 사용할 수 있다.
- 단, split() 메서드는 정규식에 매칭되지 않을 경우 자기자신을 반환한다. 즉, 공백 한칸(" ")을 기준으로 문자열을 분리할 때, 기준 문자열에 공백 한칸이 존재하지 않는 다면 그 기준 문자열을 그대로 반환한다.
메서드 | 반환되는 문자열 배열 | 배열 크기 |
"Hello World".split(" ") | [Hello, World] | 2 |
"Hello".split(" ") | [Hello] | 1 |
"".split(" ") | [] | 1 |
- 여기서 주의해야 하는 게 split() 메서드를 사용하는 문자열이 3번째 경우처럼 '빈 문자열'일 경우이다. 빈 문자열("")은 null 과 달리 문자열 값(value)이 존재는 한다. 단지, 아무 문자없이 비어있을 뿐.
- 빈 문자열("") : String 타입 변수가 참조하고 있는 인스턴스가 있으며, 단지 그 인스턴스 값이 비어있을 뿐임.
- null : String 타입 변수가 참조하고 있는 인스턴스가 없음.
- 빈 문자열에는 단어가 하나도 존재하지 않기 때문에 출력 값이 0이어야 한다. 이를 위해 split() 함수 전에 입력받은 문자열이 공백으로만 이루어져 있거나, 빈 문자열인지 별도로 체크해줘야 한다. (공백으로 이루어진 문자열도 trim() 메서드를 사용하면 공백이 제거되어 빈문자열이 됨.)
★ Key Point
- StringTokenizer 와 split() 은 둘 다 구분자를 기준으로 문자열을 분리하는 기능을 하지만, 작동방식이 다르다는 것을 유념하자.
- 문자열 처리 문제는 자신이 사용하는 언어에 어떤 문자열 처리 기능의 클래스 / 메서드가 존재하는지, 각 기능은 어떻게 되는지 숙지하고 있는 것이 중요하다. 이 문제도 StringTokenizer클래스와 split() 메서드의 존재를 몰랐다면, charAt(int index) 또는 toCharArray() 와 같이 문자열의 문자를 하나씩 쪼개서 공백 여부를 체크했어야 했을 것이다.
728x90
Comments