[프로그래머스][Java] Lv.3 단어 변환

2023. 6. 11. 18:19·Algorithms(CT)

제약 사항

  • 각 단어는 알파벳 소문자로만 이루어져 있다.
  • 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같다.
  • words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없다.
  • begin과 target은 다르다.
  • 변환할 수 없는 경우엔느 0을 return 한다.

풀이과정

  1. words에 있는 단어를 몇번째로 방문했는지 기록하기 위해 HashMap에 저장합니다.
    ( + 동시에 words 배열에 target 있는지 확인한다 -> target 없으면 변환할 수 없으므로 0을 반환합니다.)
  2. 최소로 방문해서 target을 만들어야 하므로 bfs를 이용합니다.
  3. Queue에 begin을 넣어 bfs 탐색을 시작
  4. for문을 사용해 words 배열 안의 단어들을 조사하는데,
    아직 방문한 적이 없고 현재 단어와 알파벳 한 개만 다른 단어는 Queue에 넣습니다.
  5. 4번 과정과 동시에, HashMap에 그 단어를 몇 번째 방문하는지 업데이트합니다.
  6. while문을 돌면서 target단어가 될 때까지 4,5 과정을 반복하고, 몇 번째로 방문한 단어인지 반환합니다.
  7. 만약 Queue가 빌 때까지 target단어가 완성되지 않는다면, 변환할 수 없는 것으로 보고 0을 반환합니다.

전체 코드

import java.util.*;
class Solution {
    static Map<String, Integer> map = new HashMap<>(); //몇번째 방문했는지.
    public int solution(String begin, String target, String[] words) {
        int answer = 0;
        
        boolean wordIn=false;
        for(int i=0;i<words.length;i++){
            map.put(words[i],0);
            if(words[i]==target) wordIn=true;
        }
        map.put(begin,0); //begin문자도 0번째 방문했다는걸 불러오기 위해 map에 추가.
        
        if(wordIn) return 0; //target 단어가 words 안에 없으면 0반환.
        
        answer = bfs(begin,target,words);
        
        return answer;
    }
    private int bfs(String begin, String target, String[] words){
        Queue<String> q = new LinkedList<>();
        q.add(begin); //시작점
        
        while(!q.isEmpty()){
            String now = q.poll();
            
            //target단어와 같아지면 종료
            if(now.equals(target)){
                return map.get(now); //몇번째로 now를 방문했는지 반환.
            }
            
            for(int i=0;i<words.length;i++){
                //아직 방문한적 없고 현재 단어와 알파벳 한개만 다를 경우
                if(map.get(words[i])==0 && possible(now,words[i])){
                    q.add(words[i]);
                    map.put(words[i],map.get(now)+1); //몇번째 단계인지 map에 저장.
                }
            }
        }
        return 0; //변환이 안되면 0반환.
    }
    //a와 b가 한개의 알파벳만 다른지 확인.
    private boolean possible(String a, String b){
        //같은 문자열은 안됨
        if(a.equals(b)) return false;
        
        int diff=0;//다른 문자 개수
        for(int i=0;i<a.length();i++){
            if(a.charAt(i)!=b.charAt(i))
                diff++;
            //다른 문자 개수가 2이상이면 false 리턴.
            if(diff>1)
                return false;
        }
        return true;
    }
}

'Algorithms(CT)' 카테고리의 다른 글

[프로그래머스][Java] Lv.2 예상 대진표  (0) 2023.06.12
[프로그래머스][Java] Lv.3 여행경로  (0) 2023.06.12
[프로그래머스][Java] Lv.2 영어 끝말잇기  (0) 2023.06.10
[프로그래머스][Java] Lv.2 게임 맵 최단거리  (0) 2023.06.09
[프로그래머스][Java] Lv.2 짝지어 제거하기  (0) 2023.06.08
'Algorithms(CT)' 카테고리의 다른 글
  • [프로그래머스][Java] Lv.2 예상 대진표
  • [프로그래머스][Java] Lv.3 여행경로
  • [프로그래머스][Java] Lv.2 영어 끝말잇기
  • [프로그래머스][Java] Lv.2 게임 맵 최단거리
gwee_99
gwee_99
bE bETTER!
  • gwee_99
    얼렁이와 뚱땅이
    gwee_99
  • 전체
    오늘
    어제
    • ====Category====
      • Algorithms(CT)
        • Programmers
        • Baekjoon
        • Goorm
      • Web
        • Error 해결
      • BackEnd
        • Spring
        • JPA
      • FrontEnd
        • HTML.CSS
        • JavaScript
      • Language
        • Java
      • Cloud
      • CSTS
      • Books
        • IT 5분 잡학사전
      • 일상
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    개발자북클럽
    BOJ
    DP
    IT 잡학사전
    코딩테스트
    구름
    백준
    인프런
    자바
    Greedy
    존안님
    java
    BFS
    따라하며 배우는 html css
    구름톤 챌린지
    Til
    호텔 대실
    노마드코더
    DFS
    스택
    제대로 파는 자바스크립트
    lv2
    LV.3
    프로그래머스
    lv.4
    Lv.1
    IT 5분 잡학사전
    HTML
    그리디
    LV.2
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gwee_99
[프로그래머스][Java] Lv.3 단어 변환
상단으로

티스토리툴바