BOJ

[백준 1152/JAVA] 단어의 개수

syj0522 2024. 3. 8. 21:51

문제

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

 

1152번: 단어의 개수

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

www.acmicpc.net

공백을 포함한 문자열을 입력받고 공백으로 구분되는 단어의 갯수를 구하는 문제이다.

- 참고로 풀이2만 구현함

풀이 1) split()

readLine()으로 문자열을 입력받고 split(" ")으로 공백 기준 분할된 문자열을 str[]에 저장한다.
str[]의 길이를 출력한다.

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String[] str = br.readLine().split(" ");
        bw.write(str.length + " ");
        bw.close();
    }
}

입력값 The Curious Case of Benjamin Button
실행 결과 6

입력값 (공백)The first character is a blank
실행 결과 7

맨 앞에 공백이 있는 경우, 단어의 수가 하나 더 세어진다.
원인을 알기 위해 str[]의 각 인덱스에 저장된 원소를 출력해보니 0번째 인덱스가 아닌 1번째 인덱스부터 단어가 저장되어있었다.

str[0]에 저장된 값과 null, " ", ""을 비교해봤는데 ""와 일치하는 것으로 출력됐다.
split()에 대한 자세한 내용은 이 블로그에 자세히 쓰여져있으니 참고

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String[] str = br.readLine().split(" ");

        //각 원소 출력
        for(int i=0; i<str.length; i++) { 
            bw.write("str["+i+"]: " + str[i] + "\n");
        }

        //str[0]의 값 확인
        boolean a = str[0] == null;
        boolean b = str[0] == " ";
        boolean c = str[0] == "";

        bw.write(a + " ");
        bw.write(b + " ");
        bw.write(c + " ");

        bw.close();
    }
}

입력값 The first character is a blank

실행 결과
str[0]: str[1]: The str[2]: first str[3]: character str[4]: is str[5]: a str[6]: blank false false true

그래서 조건문을 사용해 str[0] == ""인 경우 단어의 갯수가 -1이 되도록 수정하였다.

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String[] str = br.readLine().split(" ");

        if(str[0] == "")
            bw.write(str.length-1 + " ");
        else
            bw.write(str.length + " ");
        bw.close();
    }
}

IDE에서는 출력값이 바르게 나오는데, 백준에서 ArrayIndexOutOfBounds 에러가 뜬다.

- split()함수를 사용해서 해결하는 방법은 다음에 다시 추가하겠다.

풀이 2) StringTokenizer

문자열을 입력받고 StringTokenizer로 자른 후 토큰의 갯수를 리턴한다.

코드

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args)throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		
		String S = br.readLine();
		
		st = new StringTokenizer(S, " ");
		bw.write(st.countTokens()+" ");
		bw.close();
		
	}
}