99클럽 코테 스터디 33일차 TIL / [프로그래머스] 단어 변환

전종원·2024년 8월 23일
0

오늘의 학습 키워드


BFS

문제


https://school.programmers.co.kr/learn/courses/30/lessons/43163

  • 플랫폼: 프로그래머스
  • 문제명: 단어 변환
  • 난이도: Lv3

풀이


import java.util.*;

class Solution {
    
    public int solution(String begin, String target, String[] words) {
        List<String> wordList = new ArrayList<>(Arrays.asList(words));
        wordList.add(begin);
        return bfs(target, wordList);
    }
    
    public int bfs(String target, List<String> wordList) {
        int answer = 0;
        boolean[] visited = new boolean[wordList.size()];
        Queue<Integer> queue = new LinkedList<>();
        visited[wordList.size() - 1] = true;
        queue.offer(wordList.size() - 1);
        
        while(!queue.isEmpty()) {
            answer++;
            int size = queue.size();
            for(int i=0; i<size; i++) {
                int idx = queue.poll();
                
                for(int j=0; j<wordList.size()-1; j++) {
                    if(!visited[j] && isDiffOnlyOneAlphabet(wordList.get(idx), wordList.get(j))) {
                        if(wordList.get(j).equals(target)) {
                            return answer;
                        }
                        visited[j] = true;
                        queue.offer(j);
                    }
                }
            }
        }
        
        return 0;
    }
    
    public boolean isDiffOnlyOneAlphabet(String begin, String target) {
        int p1 = 0;
        int p2 = 0;
        int diffCnt = 0;
        
        for(int i=0; i<begin.length(); i++) {
            if(begin.charAt(p1) != target.charAt(p2)) {
                diffCnt++;
                
                if(diffCnt > 1) {
                    return false;
                }
            }
            
            p1++;
            p2++;
        }
        
        return true;
    }
}

접근

  • 간단한 BFS 구현 문제였습니다.
  • 현재 단어와 다음 단어가 한 개의 알파벳 차이만 존재하는지 확인하고 만족한다면, Queue에 삽입합니다.
    public boolean isDiffOnlyOneAlphabet(String begin, String target) {
        int p1 = 0;
        int p2 = 0;
        int diffCnt = 0;
        
        for(int i=0; i<begin.length(); i++) {
            if(begin.charAt(p1) != target.charAt(p2)) {
                diffCnt++;
                
                if(diffCnt > 1) {
                    return false;
                }
            }
            
            p1++;
            p2++;
        }
        
        return true;
    }
    • 문제 조건에 의해 모든 단어의 길이는 같기 때문에, 위처럼 두 단어를 비교했습니다.
      - 앞에서부터 확인하면서 서로 다른 알파벳 개수가 2개 이상이 되면 false를 리턴하고, 그렇지 않으면 true를 리턴합니다.

      public int bfs(String target, List<String> wordList) {
          int answer = 0;
          boolean[] visited = new boolean[wordList.size()];
          Queue<Integer> queue = new LinkedList<>();
          visited[wordList.size() - 1] = true;
          queue.offer(wordList.size() - 1);
          
          while(!queue.isEmpty()) {
              answer++;
              int size = queue.size();
              for(int i=0; i<size; i++) {
                  int idx = queue.poll();
                  
                  for(int j=0; j<wordList.size()-1; j++) {
                      if(!visited[j] && isDiffOnlyOneAlphabet(wordList.get(idx), wordList.get(j))) {
                          if(wordList.get(j).equals(target)) {
                              return answer;
                          }
                          visited[j] = true;
                          queue.offer(j);
                      }
                  }
              }
          }
          
          return 0;
      }
    • Queue에는 words배열의 인덱스를 저장합니다. begin은 words 배열에 포함되어 있지 않으므로, 처음에 wordList라는 리스트를 만들어 words 배열의 값을 모두 복사하고, 마지막에 begin을 추가해서 관리했습니다.

소요 시간

30분

0개의 댓글

관련 채용 정보