문제
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();
}
}
'BOJ' 카테고리의 다른 글
[백준 2224번/JAVA] 별 찍기 - 7 (0) | 2024.03.11 |
---|---|
[백준 2908/JAVA] 상수 | StringBuffer와 StringBuilder의 차이 (0) | 2024.03.09 |
[백준 2675번/JAVA] 문자열 반복 (0) | 2024.03.08 |
[백준 10809번/JAVA] 알파벳 찾기 | 문자열 (2) | 2024.03.07 |
[백준 11720번/JAVA] 숫자의 합 | charAt(), getBytes() (0) | 2024.03.06 |