loading

프로그래밍/JAVA

[백준알고리즘/문자열] 1152번 문제 : 단어의 개수(자바/JAVA)

침착곰 2021. 5. 17. 11:04
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 7단계 단어의 개수를 풀어봤습니다

이번 문제도 어렵지 않게 풀 수 있는 문제였습니다

제가 푼 방식에 대해서 설명하겠습니다!

 


문제 링크입니다

https://www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한

www.acmicpc.net

 

문제

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

 

입력

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

 

출력

첫째 줄에 단어의 개수를 출력한다.

 

 


 

 

문제 풀이

첫 번째 방법은 Split을 사용하여 문자열을 배열로 나눠 배열의 갯수를 세는 방식입니다

처음 문제를 봤을 때 Split을 사용하면 되겠다!

생각나서 풀었지만 속도가 처참... ㅠ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 변수 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// split을 사용 배열로 입력
		String[] sb = br.readLine().split(" ");
		
		// 갯수만큼 Count
		int count = sb.length;
		
		// 단어가 없으면 갯수 마이너스
		for(int i = 0; i < sb.length; i++) {
			if(sb[i].equals(""))
				count--;
		}
		
		//결과 출력
		System.out.print(count);
	}
}

 


두 번째 방법은 charAt을 사용해서 공백인 경우 갯수를 Count합니다

첫 번째 글자가 공백인 경우는 마이너스, 마지막 글자가 공백이 아니라면 플러스합니다

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 변수 선언
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 문자 입력
		String str = br.readLine();
		
		// Count 변수 선언
		int count = 0;
		
		// 공백이 있으면 Count++
		for(int i = 0; i < str.length(); i++)
		{
			if(str.charAt(i) == ' ')
				count++;
		}
		
		// 첫 글자가 공백이면 마이너스
		if(str.charAt(0) == ' ')
			count--;
		
		// 마지막 글자가 공백이 아니라면 플러스
		if(str.charAt(str.length() - 1) != ' ')
			count++;
		
		// 결과 출력
		System.out.print(count);
	}
}

 


세 번째 방법은 StringTokenizer의 메서드 중 하나인 countTokens()를 사용한 방법입니다

제일 짧고 간단한 방법입니다

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main3 {
    public static void main(String[] args) throws Exception {
		// BufferedReader 변수 선언
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        // 구분자의 갯수를 계산
        System.out.println(st.countTokens());
    }
}

 


네 번째 방법입니다

제일 최적화가 잘 된 코드입니다

System.in.read()를 통하여 입력하는 바로바로 문자열을 체크해서 갯수를 카운트합니다

public class Main {
    public static void main(String[] args) throws Exception {
    	// Count, 이전String, 현재String 변수 선언
    	int count = 0;
    	int pre_str = 32; // Ascii코드에서는 32가 공백
    	int str;
    	
    	// 반복문 시작
    	while(true) {
    		// 입력
    		str = System.in.read();
    		
    		// 첫 번째 글자가 공백인 경우를 제외하고 글자에 공백이 나온 경우 플러스
    		if(str == 32) {
    			if(pre_str != 32)
    				count++;
    		}
    		
    		// Ascii코드에서는 10이 Enter
    		// 마지막 글자가 공백이 아니라면 플러스
    		else if(str == 10) {
    			if(pre_str != 32)
    				count++;
    			break;
    		}
    		
    		pre_str = str;
    	}
    	
    	// 결과 출력
    	System.out.print(count);
    }
}

 


속도 비교

 

1. Split() 

2. charAt() 

3. StringTokenizer()

4. System.in.read()

방식으로 풀었을 때 메모리아 시간 비교입니다

4번 방식이 제일 빠른 것을 볼 수 있습니다

 

이상 백준 알고리즘 1152번 단어의 개수를 풀은 내용이었습니다

 

다음 문제 : 2021.05.17 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 2908번 문제 : 상수(자바/JAVA)

이전 문제 : 2021.05.16 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 1157번 문제 : 단어 공부(자바/JAVA)

반응형
그리드형