백준 단어 사다리

KIMYEONGJUN·5일 전
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

입력이 여러 번 주어지는데, #이 입력되기 전까지를 하나의 테스트케이스로 간주한다.
각 테스트케이스는 3자 이상 20자 이하의 대문자 알파벳으로 된 단어들이 순서대로 입력된다.
입력의 마지막 줄에는 #이 주어진다.

단어 사다리가 가능하다면 'Correct'를, 아니면 'Incorrect'를 출력한다.

내가 이 문제를 보고 생각해본 부분

BufferedReader를 통해 입력을 한 줄씩 읽는다.
단어들을 ArrayList<String> words에 저장한다.
만약 읽은 줄이 #이면, 현재 저장된 단어 리스트가 단어 사다리 조건인지 확인한다.
만약 리스트가 비어있으면(즉, 연속된 # 두 개를 만난 경우) 종료한다.
isWordLadder 함수로 검사해 조건 충족하면 "Correct", 아니면 "Incorrect" 출력.
검사 함수 내부:
isOneLetterDiff 함수는 두 단어의 길이가 같은지 확인하고, 차이가 나는 글자가 정확히 한 글자인지 검사한다.
isWordLadder는 리스트에서 인접 단어 쌍마다 isOneLetterDiff를 호출해서 모두 조건을 만족하는지 검사한다.
모든 처리가 끝나고 br.close()로 리소스도 안전하게 닫는다.

코드로 구현

package baekjoon.baekjoon_32;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

// 백준 9229번 문제
public class Main1291 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<String> words = new ArrayList<>();

        while (true) {
            String line = br.readLine();
            if (line.equals("#")) {
                // 빈 단어 리스트면 종료
                if (words.size() == 0) {
                    break;
                }
                // 테스트 케이스 검사
                if (isWordLadder(words)) {
                    System.out.println("Correct");
                } else {
                    System.out.println("Incorrect");
                }
                words.clear();
            } else {
                words.add(line);
            }
        }
        br.close();
    }

    // 두 단어가 한 글자만 다른지 검사하는 함수
    private static boolean isOneLetterDiff(String a, String b) {
        if (a.length() != b.length()) return false;
        int diffCount = 0;
        for (int i = 0; i < a.length(); i++) {
            if (a.charAt(i) != b.charAt(i)) {
                diffCount++;
                if (diffCount > 1) return false;
            }
        }
        return diffCount == 1;
    }

    // 단어 리스트 전체가 단어 사다리 조건인지 검사
    private static boolean isWordLadder(ArrayList<String> words) {
        for (int i = 0; i < words.size() - 1; i++) {
            String current = words.get(i);
            String next = words.get(i + 1);
            if (!isOneLetterDiff(current, next)) {
                return false;
            }
        }
        return true;
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글