B28432 끝말잇기
날짜 | 2024-03-30 |
사용 언어 | Java |
문제 유형 | 구현, 문자열 |
문제 URL | https://www.acmicpc.net/problem/28432 |
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 1024 MB | 4690 | 1178 | 1042 | 28.300% |
문제 #
문제 설명 #
끝말잇기는 단어를 중복하지 않고 단어의 맨 끝 글자에 이어서 말하는 놀이입니다. 끝말잇기 기록은 단어들의 나열로 이루어집니다. 올바른 끝말잇기 기록은 각 단어의 마지막 글자가 다음 단어의 첫 글자이며, 단어가 중복되어서 나타나면 안 됩니다.
끝말잇기 기록이 주어지는데, 하나의 기록은 “?
”로 가려진 채로 들어옵니다. “?
”에 들어갈 수 있는 문자열들의 후보가 주어질 때, 올바른 끝말잇기 기록을 만드는 “?
”에 들어갈 문자열을 출력하세요.
제한사항 #
첫 줄에 끝말잇기 기록의 길이 이 주어집니다. 둘째 줄부터 다음 개의 줄에는 끝말잇기의 기록 1,⋯,이 한 줄에 하나씩 주어집니다. 여기서, 하나의 는 “?
” 로 주어집니다. 나머지 는 길이 2 이상 10 이하의 영어 소문자로 이루어진 문자열입니다.
다음 줄에 후보 단어의 개수 이 주어집니다. (1≤≤100) 다음 개의 줄에는 후보 단어 1,⋯,이 주어집니다. 는 길이 2 이상 10 이하의 영어 소문자로 이루어진 문자열입니다. 1,⋯,은 서로 다릅니다.
문제의 답이 정확히 하나인 경우만 입력으로 주어집니다.
“?
”에 들어갈 수 있는 문자열을 후보 단어인 1,⋯, 중에서 하나 찾아서 출력하세요.
나의 풀이 #
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;
}
}
다른 사람의 풀이 #