• Feed
  • Explore
  • Ranking
/
/
    백준

    [Baekjoon] 끝말잇기(28432번)

    Baekjoon 끝말잇기(28432번)의 풀이 포스팅입니다.
    자료구조해시문자열구현
    w
    wooni423
    2024.06.02
    ·
    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개로 나눠져있으면 나눠서 어떻게 입력 값을 저장하고 다뤄야겠다는 고민이 우선시되어야 했음

    📚 참고 자료

    • https://cjh970422.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80-28432-%EB%81%9D%EB%A7%90%EC%9E%87%EA%B8%B0







    - 컬렉션 아티클