[프로그래머스] 단어 변환 (BFS)

2025. 4. 28. 23:25·Algorithm

문제 소개

 

오늘 풀었던 프로그래머스 - 단어 변환 문제를 정리합니다.

이 문제는 주어진 단어 집합을 이용해, begin 단어를 target 단어로 변환하는 가장 짧은 경로(최소 단계)를 구하는 문제입니다.

문제 링크: 단어 변환 - 프로그래머스


문제 접근 방식

이 문제는 다음과 같은 방식으로 접근했습니다:

  1. BFS를 사용하여 가장 짧은 변환 과정을 탐색합니다.
  2. 변환 가능한 단어는, 단 한 글자만 다르고 words 집합에 있는 단어여야 합니다.
  3. 방문한 단어는 다시 방문하지 않도록 관리(visited)합니다.

해결 과정 및 코드

핵심 아이디어

  1. Queue를 사용하여 현재 단어와 변환 깊이를 함께 저장하고 탐색합니다.
  2. 현재 단어에서 변환할 수 있는 단어를 찾으면, 그 단어를 큐에 넣고 depth를 +1 증가시킵니다.
  3. target에 도달하면, 그때의 depth를 반환합니다.
  4. 끝까지 찾아도 target을 찾지 못하면 0을 반환합니다.

코드

시간 복잡도 : O(N² × L)

import java.util.*;

class Solution {
    public int solution(String begin, String target, String[] words) {
    	// 애초에 target이 word에 있는지 확인
        if (!Arrays.asList(words).contains(target)) {
            return 0;
        }

        ArrayDeque<Word> queue = new ArrayDeque<>();
        boolean[] visited = new boolean[words.length];
        queue.add(new Word(begin, 0));

        while (!queue.isEmpty()) {
            Word current = queue.poll();
			// 현재 단어와 target 비교
            if (current.word.equals(target)) {
                return current.depth;
            }
			
            // 변환 가능한 단어 탐색
            for (int i = 0; i < words.length; i++) {
                if (!visited[i] && canConvert(current.word, words[i])) {
                    visited[i] = true;
                    queue.add(new Word(words[i], current.depth + 1));
                }
            }
        }

        return 0;
    }

    private boolean canConvert(String a, String b) {
        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; // 중복되는 단어는 없어서 diffCount = 0은 없다
    }

    static class Word {
        String word;
        int depth;

        Word(String word, int depth) {
            this.word = word;
            this.depth = depth;
        }
    }
}

'Algorithm' 카테고리의 다른 글

[프로그래머스] 방의 개수 (그래프)  (0) 2025.05.05
[프로그래머스] 네트워크 문제 (유니온 파인드 Disjoint Set)  (0) 2025.04.29
[프로그래머스] 징검다리 (이분탐색)  (0) 2025.04.28
[프로그래머스] 입국 심사 (이분탐색)  (0) 2025.04.27
[프로그래머스] H-Index (정렬)  (0) 2025.04.27
'Algorithm' 카테고리의 다른 글
  • [프로그래머스] 방의 개수 (그래프)
  • [프로그래머스] 네트워크 문제 (유니온 파인드 Disjoint Set)
  • [프로그래머스] 징검다리 (이분탐색)
  • [프로그래머스] 입국 심사 (이분탐색)
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    문법정리
    greedy
    백준
    알고리즘고득점kit
    시뮬레이션
    Level2
    프로그래머스
    boostcamp
    코테
    java
    Level3
    Kotlin
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[프로그래머스] 단어 변환 (BFS)
상단으로

티스토리툴바