백준

[백준 1152번] 단어의 개수 - JAVA[자바]

쿵철집사 2023. 6. 20. 10:02

문제

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 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 메서드로 확인한 후에 호출해야 한다.