본문 바로가기

자료구조+알고리즘/BOJ

[1152][java][백준][브론즈Ⅱ]단어의 개수

알고리즘 분류

- 구현

- 문자열



풀이

- 단어의 개수를 물어보는 문제이다. <주의>문자열의 앞과 뒤에는 공백이 있을 수 있다!

-> 공백 단위로 처리할 때 공백의 개수대로 단어를 세면 예외 발생한다

 

 

1. 문자열을 읽고 charAt 을 통해 공백을 검사하는 방법

- String의 split 메서드 : 어떤 문자 기준으로 문자열을 자르고 배열로 리턴해준다

public String[] split(String regex) - > 문자열을 regex(정규식)에 맞춰서 분리
public String[] split(String regex, int limit) -> limit만큼 문자열을 자름

- 실패시 PatternSyntaxException 인셉션을 발생

 

<split함수 주의점>

더보기
  •  [구분자로 문자열 분리하기]   

       예) split메소드를 사용해 문자열을 @ 구분자로 분리

str문자열에 @가 총 2개 들어가 있으니 arr은 3개로 분리된다. 반복문으로 하나씩 출력해서 확인

 

  •  [메타 문자 구분자로 사용하기]

split은 정규표현식으로 문자를 분리하므로 점(.)은 하나의 문자와 대응하는 메타 문자이다 

메타문자가 아닌 문자 그대로 특수문자를 구분자로 사용하고 싶을 때는 이스케이프 문자 '\\'을 앞에 붙여줘야한다.

 

  • [빈 문자열]

split의 경우 정규식으로 문자열을 분리하였을 때, 빈 문자열이 결과로 있다면 이를 하나의 문자열로 취급한다!!

 

  •  [리턴 타입을 배열로 받기 싫을 때]

배열을 통째로 리턴받아서 for문을 이용해 다 꺼낼 필요 없이, 특정 위치 부분을 바로 문자열에 저장해 접근 가능

첫 번째 값을 num에 넣어 바로 출력

  •  [구분자를 여러 개 두고 싶을 때]

 split은 정규식을 받기 때문에 구분자를 여러 개 둘 수 있다.

이메일을 '-',  '@', '.' 세가지 구분자로 구분

 

  • 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증가 예외 발생 시키지 않게 하기 위해서 

728x90
반응형