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;
}
}
다른 사람의 풀이 #