유랑하는 나그네의 갱생 기록

だけど素敵な明日を願っている -HANABI, Mr.children-

etc./BOJ

백준 1152번 단어의 개수

Madirony 2021. 7. 23. 15:46
728x90

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

 

1152번: 단어의 개수

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

www.acmicpc.net

분류 : 구현, 문자열

 

오랜만에 solved.ac를 들어갔더니 깃허브 잔디밭 같은 기능이 생겼습니다.

예전에 푼 문제들은 깃허브에 따로 백업을 해놓았는데 이젠 안 그래도 되겠네요.

적어도 한문제 이상은 푸는 걸로 꾸준히 잔디 심어봐야겠습니다.

깃헙은 이제 쓸데없는 커밋은 밀어버리고 의미 있는 것만 남겨두기로...

 

클래스라는 메뉴도 생겼습니다.

백준에서 분류별 문제만 풀땐 지루했는데 낮은 클래스에서 손 좀 풀면서 티어 좀 올려봐야겠습니다.

 

 

잡담이 많았는데 쉬운 문제도 복습하는 차원으로 블로그에 간단한 설명으로라도 적어두는 게 좋을 거 같아서...

앞으로는 자주 포스팅할 예정입니다.

작심삼일이 아니길...

 

java

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

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();
        StringTokenizer st = new StringTokenizer(str);
        int count=0;
        while (st.hasMoreTokens()) {
            st.nextToken();
            count++;
        }
        bw.write(String.valueOf(count));
        //String[] str = br.readLine().split("\\s+");
        //bw.write(String.valueOf(str.length));
        bw.flush();
        bw.close();


    }
}

 

 

문제를 보고 바로 split() 메소드로 나눠서 String 배열의 길이를 출력했지만?

 

그렇게 코드를 작성하면 테스트 케이스 2에서 걸립니다.

맨 앞에 공백이 들어가 있어서 문자열이 4개로 쪼개져서 그렇습니다.

 

두 번째 테스트 케이스에서 split으로 문자열을 자르고 배열의 0번째 요소를 출력하면...

빈 문자열이 나오죠.

 

그래서 빈 문자열을 포함하지 않도록 문자열을 자르기 위해 StringTokenizer를 사용해야 합니다.

 

먼저 StringTokenizer를 생성합니다. 문자열을 인자로 넣은 게 기본이고

두 번째 인자로 구분자를 설정하지 않았으면 구분자는 공백입니다.

 

StringTokenizer의 hasMoreTokens() 메소드는 다음 토큰이 있는지 확인하는 메소드입니다.

있으면 True, 없으면 False

nextToken() 메소드는 다음 토큰을 반환합니다.

 

사실 코드를 더 줄이고 간단하게 단어의 개수를 출력하는 방법이 있습니다.

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

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();
        StringTokenizer st = new StringTokenizer(str);
        bw.write(String.valueOf(st.countTokens()));
        bw.flush();
        bw.close();
    }
}

바로 StringTokenizer의 countTokens() 메소드를 사용하는 방법입니다.

남아있는 토큰의 개수를 반환하는 메소드인데 코드가 더 깔끔해졌죠?

알고리즘에 정답은 없지만 좀 더 효율적이고 깔끔한 코드가 최고라고 생각합니다.

 

보시다시피 시간도 줄고 메모리도 줄어들었습니다.

문제를 많이 풀다 보면 나쁜 코딩 습관이 개선된다던데 이상한 코딩 습관이 빨리 고쳐졌으면 좋겠네요.

728x90

'etc. > BOJ' 카테고리의 다른 글

[BOJ] 21609 상어 중학교 - Java  (0) 2023.03.24
[BOJ] 17142 연구소 3 - Java  (0) 2023.03.09
백준 10989번 수 정렬하기 3  (0) 2021.08.03
백준 10818번 최소,최대  (0) 2019.09.24
백준 11399번 ATM  (0) 2019.09.21