알고리즘 분류
- 구현
- 문자열
풀이
- 단어의 개수를 물어보는 문제이다. <주의>문자열의 앞과 뒤에는 공백이 있을 수 있다!
-> 공백 단위로 처리할 때 공백의 개수대로 단어를 세면 예외 발생한다
1. 문자열을 읽고 charAt 을 통해 공백을 검사하는 방법
- String의 split 메서드 : 어떤 문자 기준으로 문자열을 자르고 배열로 리턴해준다
public String[] split(String regex) - > 문자열을 regex(정규식)에 맞춰서 분리 public String[] split(String regex, int limit) -> limit만큼 문자열을 자름 |
- 실패시 PatternSyntaxException 인셉션을 발생
<split함수 주의점>
- [구분자로 문자열 분리하기]
예) split메소드를 사용해 문자열을 @ 구분자로 분리
![](https://blog.kakaocdn.net/dn/cch1Xw/btrhOzM8g4Y/g2WGxruzMnNr4QMXhiCUY1/img.png)
str문자열에 @가 총 2개 들어가 있으니 arr은 3개로 분리된다. 반복문으로 하나씩 출력해서 확인
- [메타 문자 구분자로 사용하기]
split은 정규표현식으로 문자를 분리하므로 점(.)은 하나의 문자와 대응하는 메타 문자이다
메타문자가 아닌 문자 그대로 특수문자를 구분자로 사용하고 싶을 때는 이스케이프 문자 '\\'을 앞에 붙여줘야한다.
![](https://blog.kakaocdn.net/dn/cbfamk/btrhNU4vI47/CUlSX8JLYrM0CTTllHlrN0/img.png)
- [빈 문자열]
split의 경우 정규식으로 문자열을 분리하였을 때, 빈 문자열이 결과로 있다면 이를 하나의 문자열로 취급한다!!
![](https://blog.kakaocdn.net/dn/cvYwao/btrhUhDqabm/I00vfuhXUD45FRXgEFkUVK/img.png)
- [리턴 타입을 배열로 받기 싫을 때]
배열을 통째로 리턴받아서 for문을 이용해 다 꺼낼 필요 없이, 특정 위치 부분을 바로 문자열에 저장해 접근 가능
첫 번째 값을 num에 넣어 바로 출력
![](https://blog.kakaocdn.net/dn/kDj6q/btrhQ0jo39g/l7zAgJtjKW4BSK3TxZau31/img.png)
- [구분자를 여러 개 두고 싶을 때]
split은 정규식을 받기 때문에 구분자를 여러 개 둘 수 있다.
이메일을 '-', '@', '.' 세가지 구분자로 구분
![](https://blog.kakaocdn.net/dn/o3H5f/btrhTLdVXCt/gG6kl2tZrV5T8wHi200f91/img.png)
- split() 함수를 통해 String[] 배열로 반환하여 배열의 길이를 출력해주면 된다
하지만 ! split()함수는 빈 문자열을 토큰으로 인식하기 때문에 밑에처럼 아무 문자를 입력 받지 않았을 때 0이 아닌 1로 출력된다
( 반환된 String[] 배열은 index0에 빈 문자열 하나가 반환 된 것
그러면 String[] x = str.split(" "); 에서 실제 x 배열의 크기는 1이라는 것 )
따라서, split() 함수를 쓴다면 trim() 혹은 strip() 을 통해 양쪽 공백을 지운 뒤 해당 문자열이 '빈 문자열'인지 확인하여 빈 문자열이라면 0을 출력하고 아니라면 split()함수를 통해 String[] 배열로 반환하여 배열의 길이를 출력해줘야 한다 !
<최종 코드>
2. StringTokenizer 사용하는 방법
- StringTokenizer 분리 기준을 공백으로 지정해주면 공백을 기준으로 나뉘어 토큰에 저장해주는 것
<StringTokenizer vs split>
split | StringTokenizer |
클래스에 속해있는 메소드 | java.util에 포함되어 있는 클래스 |
정규표현식으로 구분 => 빈문자열을 토큰으로 인식 |
문자로 구분 => 빈 문자열을 토큰으로 인식하지 않음 |
결과값이 문자열 배열 | 결과 값이 문자열 |
- 더 간단!
- BufferedReader 쓰는 방법 (Scanner 보다 속도가 빠름, 시간 단축)
3. 문자 하나씩 판별하여 카운팅
- 문자 하 나씩 읽어들이면서 문자가 공백인지 아닌지에 따라 count 해주는 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import java.io.IOException;
// 문자 하나씩 검사 하는 방법
// 이전의 문자 저장할 pre_str, 현재 입력받은 문자 저장할 str
// ASCII 32 = space
public class solution3 {
public static void main(String[] args) throws IOException {
int count = 0;
int pre_str = 32; // 공백 의미
int str;
while(true){
str = System.in.read(); //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);
}
|
cs |
입력받은 문자가 공백이면서 이전의 문자가 공백이 아닐 경우에 count변수 1 증가시킴
-> 첫문자와 마지막 문자가 만약 공백이라면 count변수가 1증가 예외 발생 시키지 않게 하기 위해서
'자료구조+알고리즘 > BOJ' 카테고리의 다른 글
[18111][java][백준]마인크래프트 (0) | 2021.10.24 |
---|---|
[1966][java][백준]프린터큐 (0) | 2021.10.24 |
[1205][java][백준][실버Ⅴ]등수구하기 (0) | 2021.10.18 |
[1173][java][백준][브론즈Ⅱ]운동 (0) | 2021.10.15 |
[1100][java][백준][브론즈Ⅱ]하얀칸 (0) | 2021.10.15 |