Blog

B28432 끝말잇기

날짜 2024-03-30
사용 언어 Java
문제 유형 구현, 문자열
문제 URL https://www.acmicpc.net/problem/28432
시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 1024 MB 4690 1178 1042 28.300%

문제 #

문제 설명 #

끝말잇기는 단어를 중복하지 않고 단어의 맨 끝 글자에 이어서 말하는 놀이입니다. 끝말잇기 기록은 단어들의 나열로 이루어집니다. 올바른 끝말잇기 기록은 각 단어의 마지막 글자가 다음 단어의 첫 글자이며, 단어가 중복되어서 나타나면 안 됩니다.

끝말잇기 기록이 주어지는데, 하나의 기록은 “?”로 가려진 채로 들어옵니다. “?”에 들어갈 수 있는 문자열들의 후보가 주어질 때, 올바른 끝말잇기 기록을 만드는 “?”에 들어갈 문자열을 출력하세요.

제한사항 #

첫 줄에 끝말잇기 기록의 길이 $N$ 이 주어집니다. $(1 \le N \le 100)$ 둘째 줄부터 다음 $N$개의 줄에는 끝말잇기의 기록 1,⋯,$S_1, \cdots, S_N$이 한 줄에 하나씩 주어집니다. 여기서, 하나의 $S_i$는 “?” 로 주어집니다. 나머지 $S_i$는 길이 2$2$ 이상 10$10$ 이하의 영어 소문자로 이루어진 문자열입니다.

다음 줄에 후보 단어의 개수 $M$이 주어집니다. (1≤≤100)$(1 \le M \le 100)$ 다음 $M$개의 줄에는 후보 단어 1,⋯,$A_1, \cdots, A_M$이 주어집니다. $A_i$는 길이 2$2$ 이상 10$10$ 이하의 영어 소문자로 이루어진 문자열입니다. 1,⋯,$A_1, \cdots, A_M$은 서로 다릅니다.

문제의 답이 정확히 하나인 경우만 입력으로 주어집니다.

?”에 들어갈 수 있는 문자열을 후보 단어인 1,⋯,$A_1, \cdots, A_M$ 중에서 하나 찾아서 출력하세요.


나의 풀이 #

import java.util.Scanner;

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


        String[] words = new String[Integer.parseInt(sc.nextLine())];
        for (int i = 0; i < words.length; i++) {
            words[i] = sc.nextLine();
        }

        String start = "";
        String end = "";
        for (int i = 0; i < words.length; i++) {
            if (words[i].equals("?")) {
                start = (i == 0) ? "" : String.valueOf(words[i - 1].charAt(words[i - 1].length() - 1));
                end = (i == words.length-1) ? "" : String.valueOf(words[i + 1].charAt(0));
                // 재귀 함수 사용 시 return
            }
        }

        String[] candidate = new String[Integer.parseInt(sc.nextLine())];
        for (int i = 0; i < candidate.length; i++) {
            candidate[i] = sc.nextLine();
        }

        for (String cand : candidate) {
            if (!containWord(cand, words) && cand.startsWith(start) && cand.endsWith(end)) {
                System.out.println(cand);
            }
        }
    }

    private static boolean containWord(String candidate, String[] words) {
        for (String word : words) {
            if (candidate.equals(word)) {
                return true;
            }
        }
        return false;
    }
}

실행결과

다른 사람의 풀이 #



관련개념 학습 #