자료구조해시문자열구현
💡 본 포스팅은 백준 온라인 저지 에서 제공하는 문제의 풀이를 비상업적 목적으로 게시하였습니다.
문제링크 : 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개로 나눠져있으면 나눠서 어떻게 입력 값을 저장하고 다뤄야겠다는 고민이 우선시되어야 했음