Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");
이런 식으로 푸니까 바로 오류 발생.. 무엇인지 파헤쳐 보기로했다.
split()
한 다음 length
하면 나올 줄 알았다.. 하지만 실수였다String
은 메모리 주소를 할당하고 보여주기 때문에 출력값이 메모리 주소로 반환되어 오류라고 생각했었다..보아하니 입력을 공백으로 받았을 경우가 예외를 발생하거나 split할때 매칭되는 문자 및 문자열이 없는 경우 자기 자신을 발생시키는 경우가 있다고 한다
그렇기에 s를 trim()
이나 strip()
을 통해 앞/뒤로 공백을 제거하고, 제거한 후의 길이가 0이라면 값이 없는 문자열이기에 0을 리턴하거나 그게 아니라면 split(" ")
을 통해 단어를 출력해야한다.
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);
}
}
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());
}
}
내가 했던 자바들의 기억은 통째로 사라졌다.. 기본적인 입출력도 관리를 못하다니.. 이제부터 새롭게 시작한다음 마음가짐으로 다시 빡집중하여 모든걸 흡수하고 기록해서 내걸로 만들어야겠다 ..!
[문제링크] 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