문제
영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.
출력
첫째 줄에 단어의 개수를 출력한다.

<어려웠던 점>
-공백을 기준으로 단어의 개수를 세는 법을 어떻게 접근할것인지?
사실 아무리 생각해도 내 지식으로 한계가 있는 문제같아서 '자바 단어 개수' 를 구글링해보니 문제풀이가 있어서 chatgpt에게 물어보기로 했다.. Split함수를 사용하여 해결하였다.
제출 후 정답처리되었지만, 코드가 너무 길고 쓸데없이 복잡해서 다른 분들의 코드를 참고하였다..
<제출 코드>
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//Scanner 사용하여 문자열을 입력받음
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
//countWords 메소드를 호출하여 입력받은 문자열의 단어 개수를 계산
int wordCount = countWords(input);
System.out.println(wordCount);
scanner.close();
}
private static int countWords(String input) {
// 문자열의 앞 뒤 공백 제거
input = input.trim();
if(input.isEmpty()) {
return 0;
}
// 공백을 기준으로 단어 분리
String[] words = input.split("\\s+");
// 분리된 단어의 개수 반환
return words.length;
}
}
Split 함수
split 함수는 Java 문자열을 특정 구분자를 기준으로 분할하여 문자열 배열로 반환하는 함수.
split 함수의 사용법은 다음과 같다.
String[] split(String regex)
-regex: 분할에 사용할 정규 표현식 또는 일반 문자열
-split 함수는 입력된 문자열을 regex에 지정된 패턴을 기준으로 분할함. 그리고 분할된 각 부분은 문자열 배열로 반환됨. 다음은 split 함수의 몇 가지 예시이다.
1. 특정 문자를 기준으로 분할하기:
String input = "apple,banana,grape";
String[] fruits = input.split(",");
위의 예시에서는 ","를 구분자로 사용하여 input 문자열을 분할. fruits 배열에는 "apple", "banana", "grape"가 각각 저장됨.
2. 공백을 기준으로 분할하기:
String input = "Hello World Java";
String[] words = input.split("\\s+");
위의 예시에서는 "\\s+"를 구분자로 사용하여 input 문자열을 분할. "\\s+"는 정규 표현식으로 공백(스페이스, 탭, 줄 바꿈 등)을 나타냄. words 배열에는 "Hello", "World", "Java"가 각각 저장됨.
3. 정규 표현식을 사용하여 분할하기:
String input = "apple,banana123grape";
String[] parts = input.split("[,\\d]+");
위의 예시에서는 "[,\\d]+"를 구분자로 사용하여 input 문자열을 분할. [ ]는 정규 표현식에서 문자 클래스(character class)를 나타내며, [,]는 쉼표를 나타냄. \\d는 숫자(digit)를 나타내며, +는 하나 이상의 연속된 문자를 의미. parts 배열에는 "apple", "banana", "grape"가 각각 저장됨.
다른 방법은 StringTokenizer 클래를 이용하는것이다.
코드가 간결해졌다.
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String S = in.nextLine();
in.close();
// st 에 공백을 기준으로 나눈 토큰들을 st 에 저장한다
StringTokenizer st = new StringTokenizer(S," ");
// countTokens() 는 토큰의 개수를 반환한다
System.out.println(st.countTokens());
}
}
출처 : https://st-lab.tistory.com/65
StringTokenizer 클래스
StringTokenizer 클래스는 Java에서 문자열을 특정 구분자를 기준으로 분리하는 유틸리티 클래스이다.
tringTokenizer를 사용하면 문자열을 간단하게 토큰으로 분리할 수 있다.
StringTokenizer 클래스를 사용하면 문자열을 구분자를 기준으로 편리하게 분리할 수 있다. 하지만 Java 8부터는 String.split 메서드나 정규 표현식을 사용하는 방법이 더 권장되고 유연한 방법이다. StringTokenizer는 이전 버전과의 호환성을 위해 제공되는 클래스이며, 새로운 코드에서는 String.split이나 정규 표현식을 사용하는 것이 좋다.
1. StringTokenizer 객체 생성하기:
StringTokenizer tokenizer = new StringTokenizer(input, delimiters);
-input: 분리할 대상 문자열이다.
-delimiters: 구분자로 사용할 문자열이다. 여러 개의 구분자를 사용할 수 있으며, 구분자들은 모두 분리의 기준이 된다.
2. hasMoreTokens 메서드:
boolean hasMoreTokens()
-StringTokenizer 객체에 더 이상 처리할 토큰이 남아있는지 여부를 반환한다.
3. nextToken 메서드:
String nextToken()
-StringTokenizer 객체에서 다음 토큰을 반환한다.
-hasMoreTokens 메서드로 확인한 후에 호출해야 한다.
'백준' 카테고리의 다른 글
[백준 2480번] 주사위 세개 - JAVA[자바] (1) | 2023.06.18 |
---|---|
[백준 14681번] 사분면 고르기 (1) | 2023.06.16 |
[백준 10818번] 최소, 최대 (1) | 2023.06.14 |
[백준 27866번] 문자와 문자열 (1) | 2023.06.10 |
[백준 2884번] 알람 시계 (1) | 2023.06.08 |