백준 1152번 자바
https://www.acmicpc.net/problem/1152
문제 내용은 아래 더보기를 누르면 나온다.
알고리즘
영어 대소문자와 공백으로 이루어진 문자열 str (str <= 1,000,000)
단어는 공백 한 개로 구분되며, 공백은 연속해서 나오지 않는다.
한 문자열은 공백으로 시작하거나 끝날 수 있다.
문자열 str에 단어를 구한다.
1. 문자열 str을 입력받는다.
2. 문자열을 공백(" ")을 기준으로 나눈다.
3. 나눈 갯수를 세서 출력한다.
풀이1
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class No_1152 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
System.out.println(st.countTokens());
}
}
StringTokenizer를 알고있었기에 문자열을 공백(" ")으로 나누어서 토큰으로 만들었다.
StringTokenizer는 두번째 파라미터에 내가 나누고 싶은 문자를 넣으면 그것을 기준으로 나누어지는데,
지금처럼 생략하게 된다면 공백(" ")이 기본값으로 나누어지게 된다.
나누어진 토큰의 수를 반환하는 StringTokenizer의 메서드인 countTokens()를 사용하여 갯수를 바로 출력하였다.
풀이2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class No_1152 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = 0;
int gap = 32;
byte[] str_arrays = br.readLine().getBytes();
for (byte ch : str_arrays) {
if (ch != 32) {
if (gap == 32) {
count++;
}
}
gap = ch;
}
System.out.println(count);
}
}
문자열을 getBytes() 메서드를 사용하여 byte[]로 받아서 공백인지 아닌지 비교하였다.
32를 비교하는 이유는 아스키코드값으로 32는 공백(" ")을 뜻하기 때문이다.
그래서 byte[]에서 꺼낸 문자가 공백이 아니고 그 전의 문자가 공백일 때 count를 +1 해주었다.
먼저 공백일 때를 생각해봤는데 마지막에 단어를 count하기 어려우므로 공백이 아닐때를 먼저 가정해서 count를 세었다.
풀이3
import java.io.IOException;
public class No_1152 {
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++;
}
} else if (str == 10) {
if (pre_str != 32) {
count++;
}
break;
}
pre_str = str;
}
System.out.println(count);
}
}
풀이3은 BufferedReader를 사용하지 않고 원시 입력 형태로 문자 하나씩 읽어서 구분하였다.
while문으로 무한 반복하여서 문자를 계속 받았다.
받은 문자 str이 공백이고 그 전 문자 pre_str이 공백이 아닐 때 count++ 을 한다.
만약 str이 10이고 pre_str이 공백이 아니면 count++을 해주고 break로 반복문을 멈춘다.
이 때는 pre_str이 공백이더라도 break를 무조건 하게 된다. 왜냐하면 아스키코드값인 10은 개행을 뜻하기 때문이다.
즉, 입력받을 문자가 없다는 뜻이다.
풀이 3은 다음 블로그를 참고하였다.
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 5622번 - Java(자바) (0) | 2022.02.27 |
---|---|
[백준] 2908번 - Java(자바) (0) | 2022.02.23 |
[백준] 1157번 - Java(자바) (0) | 2022.02.17 |
[백준] 2675번 - Java(자바) (0) | 2022.02.14 |
[백준] 10809번 - Java(자바) (0) | 2022.02.12 |