💡 본 포스팅은 백준 온라인 저지 에서 제공하는 문제의 풀이를 비상업적 목적으로 게시하였습니다.
문제링크 : https://www.acmicpc.net/problem/28432
🤔 풀이 사고
문제의 입력&출력 조건
조건에 따른 풀이의 흐름은 다음과 같다.
끝말 잇기 기록을 입력받는다.(N개)
단어 기록들을 저장할
String 배열및?의 인덱스 변수를 초기화한다.단어 중복 체크를 위해 중복을 허락하지 않는
Hashset에 단어 기록들을 저장한다.배열에 끝말잇기 기록을 저장한다.
후보 단어들을 입력받는다.(M개)
?이 제일 앞,뒤 인 경우, N=1일 경우, 단어가 중복될 경우의 수들을 포함해서 끝말잇기 조건식을 작성한다.출력
🟢 정답 코드
import java.io.*;
import java.util.HashSet;
import java.util.Set;
/*(1) 끝말잇기 기록을 입력받는다.
(2) 중복 체크를 위해 HashSet에 단어들을 저장한다.
(3) 배열에 끝말잇기 기록을 저장한다.
(4) ? 의 인덱스를 저장한다.
(5) 후보단어들을 입력받는다.
(6) 단일 단어를 입력받았을 경우,중복되는 경우의 조건식을 적용한다.
(7) 일반적인 경우 끝말잇기의 규칙 조건식을 적용한다.
(8) 출력 수행시간 : 108ms
메모리 : 14212kb
*/public class 끝말잇기28432 {public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Set<String> previous = new HashSet<>();
int N = Integer.parseInt(br.readLine());
int idx = -1;
String[] arr = new String[N];
for (int i = 0; i < N; i++) {
String word = br.readLine();
if (!"?".equals(word)) previous.add(word);
else idx = i;
arr[i] = word;
}
int M = Integer.parseInt(br.readLine());
for (int i = 0; i < M; i++) {
String candidate = br.readLine();
if (N == 1) {
System.out.println(candidate);
break;
}
;
if (previous.contains(candidate)) continue;
if (idx == 0) {
if (arr[idx + 1].charAt(0) == candidate.charAt(candidate.length(- -1)) {
System.out.println(candidate);
break;
}
} else if (idx == N - 1) {
if (arr[idx - 1].charAt(arr[idx - 1].length() - 1) == candidate.charAt(0)) {
System.out.println(candidate);
break;
}
} else {
if (arr[idx + 1].charAt(0) == candidate.charAt(candidate.length() - 1)
&& arr[idx - 1].charAt(arr[idx - 1].length() - 1) == candidate.charAt(0)) {
System.out.println(candidate);
break;
}
}
}
}}❗어려웠던 점
정답 코드와 사고 흐름은 유사했으나 정답 코드를 온전히 나 스스로 작성하지는 못하였음
자바 컬렉션에 대해 잘 숙지하고 있었다면 능숙하게 컬렉션에 담긴 자료들에 대해 비교 검토할 수 있었을 거라 생각함
무작정 코드를 치는 게 아니라 우선은 입력 값이 2개로 나눠져있으면 나눠서 어떻게 입력 값을 저장하고 다뤄야겠다는 고민이 우선시되어야 했음