[Do It! 코딩테스트 자바편(김종관)] 문제 069(백준 14425번)
왜 교재 정답의 경우 sc.nextLine()을 안쓰고 sc.next()를 썼을까?
- 예제 입력처럼 “5 11”을 입력하고 엔터를 친다. 그러면 nextInt() 두 번해서 n,m에 저장한다. 그 후 sc.nextLine()을 하게 되면 \n을 읽어들여서 문제가 발생한다.
- 참고 사이트
- next()
- 공백을 기준으로 한 단어 또는 한 문자씩 입력받는다.
- 버퍼에 입력된 문자나 문자열에서 공백 전까지의 단어를 읽는다.
- 개행 문자를 가져오지 않는다.
- nextLine()
- 문자 또는 엔터를 치기 전까지의 문장 전체를 입력받는다.
- 버퍼에 입력된 문자열을 개행 문자까지 다 가져온다.
- 인용: “좀 더 설명하자면, 위에 출력결과처럼 10을 입력하고 Enter를 쳤다면 버퍼에 10\이 존재한다. 이때 nextInt()가 버퍼의 내용을 가져올 때 개행문자를 무시하고 가져오기 때문에 10만 가져오게 된다. 그러면 버퍼에 \n이 남아있는데 nextLine()은 공백문자, 개행문자를 포함시키기 때문에 \n만 가져오고 프로그램이 종료되는 것이다.”
- next()
느낀점
- 처음 배우는 자료구조라 문제 정답을 보면서 이해했다.
문제
풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
Node root = new Node();
for (int i = 0; i < n; i++) {
String text = sc.next();
Node now = root;
for (int j = 0; j < text.length(); j++) {
char c = text.charAt(j);
if (now.next[c - 'a'] == null)
now.next[c - 'a'] = new Node();
now = now.next[c - 'a'];
if (j == text.length() - 1)
now.isEnd = true;
}
}
int answer = 0;
for (int i = 0; i < m; i++) {
String text = sc.next();
Node now = root;
for (int j = 0; j < text.length(); j++) {
char c = text.charAt(j);
if (now.next[c - 'a'] == null)
break;
now = now.next[c - 'a'];
if (j == text.length() - 1 && now.isEnd)
answer++;
}
}
System.out.println(answer);
sc.close();
}
}
class Node {
Node[] next = new Node[26];
boolean isEnd;
}