[BOJ 1152] 단어의 개수 JAVA

popolarburr·2023년 1월 7일
0
post-thumbnail

1. 문제의 이해

  • 영어 대소문자와 공백으로 이루어진 문자열에서, 몇개의 단어가 있는지 파악하는 문제
  • 문자열에 존재하는 공백을 기준으로 나누어 배열을 만들고, 이 배열에 대한 아이템 개수를 구하면 끝!

2. 첫 풀이

  • 자바를 처음 다시 시작한 나로써는 기억나는 문법이 크게 많지 않기에 입력을 받고 이에 대한 공백을 찾아 개수를 찾기로 생각했다.

Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");

이런 식으로 푸니까 바로 오류 발생.. 무엇인지 파헤쳐 보기로했다.


2.1 실수

  • 우선 몇 년만에 다시 시작한 자바가 익숙하지 않아서 그냥 생각나는 것만 적용하도록 했다. 그래서 split()한 다음 length하면 나올 줄 알았다.. 하지만 실수였다
  • 왜냐하면 자바에서 String은 메모리 주소를 할당하고 보여주기 때문에 출력값이 메모리 주소로 반환되어 오류라고 생각했었다..
    • 보다 정확히 말하면 String은 문자열 객체의 인스턴스 주소를 담고있는 참조형 변수이다.

2.2 예외

보아하니 입력을 공백으로 받았을 경우가 예외를 발생하거나 split할때 매칭되는 문자 및 문자열이 없는 경우 자기 자신을 발생시키는 경우가 있다고 한다

그렇기에 s를 trim()이나 strip()을 통해 앞/뒤로 공백을 제거하고, 제거한 후의 길이가 0이라면 값이 없는 문자열이기에 0을 리턴하거나 그게 아니라면 split(" ")을 통해 단어를 출력해야한다.


3. 1차 재풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String[] s = sc.nextLine().strip().split(" ");
        
        int result = s.length;

        System.out.println(result);

    }
}

4. 2차 재풀이

Q. 왜 올바른 값을 도출했는데 재풀이를 했을까?

A. 물론 올바른 값, 원하는 값을 도출했지만 뭔가 코드가 내키지 않고 찝찝하기에 조금 더 원하는 답을 찾기위해 다시 풀어봄!

그렇게 찾아본 것이 StringTokenizer라는 것이다.

StringTokenizer란 하나의 문자열을 여러개의 토큰으로 분리하는 클래스이다. 즉, 공백을 기준으로 여러개의 토큰(=단어)로 분리할 수 있는 클래스 인것이다.
이를 활용하여 한 2번째 풀이.

import java.util.Scanner;
import java.util.StringTokenizer;

public class Main1125 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        StringTokenizer st = new StringTokenizer(s, " ");
        System.out.println(st.countTokens());
    }
}

5. 정리

내가 했던 자바들의 기억은 통째로 사라졌다.. 기본적인 입출력도 관리를 못하다니.. 이제부터 새롭게 시작한다음 마음가짐으로 다시 빡집중하여 모든걸 흡수하고 기록해서 내걸로 만들어야겠다 ..!

[문제링크] https://www.acmicpc.net/problem/1152
[참조1 - 문제풀이] https://st-lab.tistory.com/65
[참조2 - Java String의 깊은 이해] https://aljjabaegi.tistory.com/465
[참조3 - Java StringTokenizer] https://jhnyang.tistory.com/398

profile
차곡차곡

0개의 댓글