avatar
wooni-develog

[Baekjoon] 끝말잇기(28432번)

Baekjoon 끝말잇기(28432번)의 풀이 포스팅입니다.
자료구조해시문자열구현
7 months ago
·
4 min read

💡 본 포스팅은 백준 온라인 저지 에서 제공하는 문제의 풀이를 비상업적 목적으로 게시하였습니다.

문제링크 : https://www.acmicpc.net/problem/28432

🤔 풀이 사고

문제의 입력&출력 조건

until-397

조건에 따른 풀이의 흐름은 다음과 같다.

  1. 끝말 잇기 기록을 입력받는다.(N개)

  2. 단어 기록들을 저장할 String 배열?의 인덱스 변수를 초기화한다.

  3. 단어 중복 체크를 위해 중복을 허락하지 않는 Hashset 에 단어 기록들을 저장한다.

  4. 배열에 끝말잇기 기록을 저장한다.

  5. 후보 단어들을 입력받는다.(M개)

  6. ? 이 제일 앞,뒤 인 경우, N=1일 경우, 단어가 중복될 경우의 수들을 포함해서 끝말잇기 조건식을 작성한다.

  7. 출력

🟢 정답 코드

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개로 나눠져있으면 나눠서 어떻게 입력 값을 저장하고 다뤄야겠다는 고민이 우선시되어야 했음

📚 참고 자료


- 컬렉션 아티클






백엔드 개발자 취준생 우니입니다.