본문 바로가기
코딩 테스트/백준

[백준] 1152번 단어의 개수 - java 성능별 4개의 정답

by snow_hong 2023. 4. 13.

백준 115번: 단어의 개수 링크

 

1152번: 단어의 개수

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

www.acmicpc.net


 

- 문제

단순히 단어 개수를 구하는 문제이다.

단, 공백이 앞뒤에 들어갈 수 있으면 공백만 들어갈 수 있다.

 


문제를 푸는 방법은 다양하다.

나는 처음에 아무생각없이 split로 하면 금방이겠네~ 라고 생각했다.

빠르게 작성하고 제출을 하는데 틀렸다고 한다.

예제를 전부 테스트를 해보았는데 다 되는데 ??????? 이상태였다.

그래서 인터넷 찬스로 검색을 해보니 그냥 공백만 입력하면 0으로 나와야하는데 1로 나온다는 허점을 발견했다.

공백을 입력하면 따로 처리를 해줘야 완벽한 코딩이 된다.

 

검색한 김에 4가지 방법을 정리해보려고 한다.

1. String - Scanner/split 

2. String - Scanner/StringTokenizer 

3. BufferedReader - StringTokenizer 

4. while - System.in.read 

 

성능차이는 생각보다 많이 난다.

4,3,2,1 순으로 성능이 좋다.

 

성능이 안좋은 것 부터 알아보자!

1. String - Scanner/split

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Main mn = new Main();
		mn.test6();
		
	}


		private void test6(){
			
			Scanner sc = new Scanner(System.in);
			
			String str  = sc.nextLine();
			String off = str.trim(); //양옆공백제거
			
			if(off.length() == 0){
				System.out.println(0);
			}else {
				System.out.println(off.split("\\s+").length);
			}
			
			
		}
	

}

 

2. String - Scanner/StringTokenizer 

StringTokenizer 을 사용하여 분리 기준을 공백으로 지정해주면 공백을 기준으로 나뉘어 토큰에 저장해주는 것이다.

단, StringTokenizer 을 사용하기 위해서는 java.util.StringTokenizer; 을 import 해주어야 한다.

그리고 문자열의 처음과 마지막의 공백에 대해 별다른 예외처리를 안해줘도 되니 매우 편리한 방법이다.

 

[java] 문자열 분리하기 - StringTokenizer 클래스

StringTokenizer 클래스란? StringTokenizer 클래스는 하나의 문자열을 여러 개의 토큰(token)으로 분리하는 클래스이다. 즉, 문자열을 구분자로 분리해주는 클래스이다. 만약 BufferedReader 클래스의 메서드

hong42.tistory.com

 

import java.util.*;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Main mn = new Main();
		mn.test6();
		
	}

		private void test6(){
			
			Scanner sc = new Scanner(System.in);
			
			String str  = sc.nextLine();
			
            // st 에 공백을 기준으로 나눈 토큰들을 st 에 저장한다
	    	StringTokenizer st = new StringTokenizer(str," ");
		
		    // countTokens() 는 토큰의 개수를 반환한다
		    System.out.println(st.countTokens());	
			
		}
		
		
		

}

 

3. BufferedReader - StringTokenizer 

import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
        
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));

		// st 에 공백을 기준으로 나눈 토큰들을 st 에 저장한다
		StringTokenizer st = new StringTokenizer(br.readLine()," "); 
                
        	// countTokens() 는 토큰의 개수를 반환한다
		System.out.print(st.countTokens());
    }
}

 

4. while - System.in.read 

buffer 을 사용하지 않고 원시 입력 형태로 문자 하나씩 읽어들이면서 읽어들인 문자가 공백인지 아닌지에 따라 count 를 해주는 방법이다.

import java.io.IOException;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
 
		int count = 0;
		int pre_str = 32;	// 공백을 의미한다.
		int str ;
		
		
		while(true) {
			str = System.in.read();
            
			// 입력받은 문자가 공백일 때,
			if(str == 32) {
				// 이전의 문자가 공백이 아니면
				if(pre_str != 32) count++;
			}
 
			// 입력받은 문자가 개행일때 ('\n')
			else if(str == 10) {
				// 이전의 문자가 공백이 아니면
				if(pre_str != 32) count++;
				break;
			}
			
			pre_str = str;
			
		}
		
		System.out.println(count);
	}
 
}

 

 

728x90

댓글