업데이트:


카테고리:

태그: ,


왜 교재 정답의 경우 sc.nextLine()을 안쓰고 sc.next()를 썼을까?

  • 예제 입력처럼 “5 11”을 입력하고 엔터를 친다. 그러면 nextInt() 두 번해서 n,m에 저장한다. 그 후 sc.nextLine()을 하게 되면 \n을 읽어들여서 문제가 발생한다.
  • 참고 사이트
    • next()
      • 공백을 기준으로 한 단어 또는 한 문자씩 입력받는다.
      • 버퍼에 입력된 문자나 문자열에서 공백 전까지의 단어를 읽는다.
      • 개행 문자를 가져오지 않는다.
    • nextLine()
      • 문자 또는 엔터를 치기 전까지의 문장 전체를 입력받는다.
      • 버퍼에 입력된 문자열을 개행 문자까지 다 가져온다.
    • 인용: “좀 더 설명하자면, 위에 출력결과처럼 10을 입력하고 Enter를 쳤다면 버퍼에 10\이 존재한다. 이때 nextInt()가 버퍼의 내용을 가져올 때 개행문자를 무시하고 가져오기 때문에 10만 가져오게 된다. 그러면 버퍼에 \n이 남아있는데 nextLine()은 공백문자, 개행문자를 포함시키기 때문에 \n만 가져오고 프로그램이 종료되는 것이다.”



느낀점

  • 처음 배우는 자료구조라 문제 정답을 보면서 이해했다.



문제

문자열 집합(백준: 14425번)

image



풀이

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;
}