갓생사는 김초원의 개발 블로그
chocho_log
갓생사는 김초원의 개발 블로그
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 개발 (22)
      • Spring (4)
      • Java (3)
      • Database (2)
      • Elasticsearch (3)
      • ETC (3)
      • JPA (3)
      • 이슈 (1)
    • 코딩 테스트 (43)
      • 프로그래머스 (23)
      • 백준 (12)
      • TIP (8)
    • 자료구조 (2)
    • 알고리즘 (4)
    • 잡생각 (0)
    • 경험 (5)
      • AWS re:Invent 2024 (5)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 지연로딩
    • jar
    • Lazy Loading
    • querydsl
    • war
    • 디자인패턴 #SOLID 원칙
    • Spring Boot Embedded Tomcat
    • jpa

    최근 댓글

    최근 글

    갓생사는 김초원의 개발 블로그

    chocho_log

    코딩 테스트/프로그래머스

    [프로그래머스][Level3][JAVA][단어변환]

    2021. 1. 9. 01:02

    [문제 설명]

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

     

    코딩테스트 연습 - 단어 변환

    두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수

    programmers.co.kr

     

    [문제 풀이]

    문제에 나온 예시로 설명한다.

    예시 > String begin = "hit";
               String target = "cog";
               String[] words = {"hot", "dot", "dog", "lot", "log", "cog"};

     

    1) String을 담는 Queue를 생성, 단어의 확인여부를 체크하는 boolean[] confirmed 를 생성한다.

    2) words 배열에서 hit(begin) 과 한글자만 다른 문자열만 뽑아 Queue에 add한다. 
        그리고 해당 문자열의 index값에 대응하게 confirmed[i] = true 처리해준다.

    -> confirmed[i] = true 값을 주는 이유 : 재귀를 돌면서 한글자만 다른 문자열을 추출하는데, 한 번 확인한 문자열을 또 queue에 담는 경우 무한 재귀에 빠지게 된다. 

    3) begin과 한글자만 다른 문자열들을 뽑았으므로 count를 1증가시킨다. Queue에 구분자 "/"를 add한다. 

    4) Queue가 isEmpty일때까지 while문을 순회한다. 

      4-1)  Queue 값을 poll하여 String s에 담는다. 

      4-2) s가 target과 같은 문자라면 count를 return하고 종료한다. 

      4-3) s가 구분자 "/" 라면 count를 1증가 시키고, 또 구분자 "/"를 넣는다. 

      4-4) s가 4-2, 4-3에도 해당하지 않는 일반 문자라면 2번과 유사하게 word배열에서 s와 한글자만 다른 문자열들을 추출하여 Queue에              add한다.
              Queue에 add한 문자열의 index에 대응하여 confirmed[i] = true값을 넣어준다. 

    5) count를 return한다. 

     

    느낀점 : 남들은 다 dfs로 푼것 같은데 나는 bfs로 풀어서 슬프다. 왜 나만 특이한 생각을 갖고 있는 것인가.. dfs로 푸는 방법을 얼른 알아보자.

     

    [JAVA code]

    - 내가 푼 bfs를 이용한 code 

    package com.algorithm.programmers.level2;
    
    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Queue;
    
    public class Test40 {
        public static void main(String[] args) {
            String begin = "hit";
            String target = "cog";
            String[] words = {"hot", "dot", "dog", "lot", "log", "cog"};
    
            System.out.println(solution(begin, target, words));
        }
    
        /**
         *
         * @param begin
         * @param target
         * @param words
         * @return
         */
        public static int solution(String begin, String target, String[] words) {
            List<String> wordList = Arrays.asList(words);
            if (!wordList.contains(target)) {
                return 0;
            }
    
            int answer = getMinStepCount(begin, target, wordList);
            return answer;
        }
    
        /**
         *
         * @param being
         * @param target
         * @param wordList
         * @return
         */
        public static int getMinStepCount(String being, String target, List<String> wordList) {
            int count = 0;
            String SEPERATOR = "/";
            Queue<String> q = new LinkedList<>();
            boolean[] confirmed = new boolean[wordList.size()];
    
            for (int i = 0; i < wordList.size(); i++) {
                String s = wordList.get(i);
                if (isDiffOnlyOneChar(being, s)) {
                    q.add(s);
                    confirmed[i] = true;
                }
            }
            count++;
            q.add(SEPERATOR);
    
            while (!q.isEmpty()) {
                String s = q.poll();
    
                if (s.equals(target)) {
                    return count;
                }
    
                if (s.equals(SEPERATOR)) {
                    count++;
                    q.add(SEPERATOR);
                } else {
                    for (int i = 0; i < wordList.size(); i++) {
                        String w = wordList.get(i);
                        if (!confirmed[i] && isDiffOnlyOneChar(s, w)) {
                            confirmed[i] = true;
                            q.add(w);
                        }
                    }
                }
            }
            return count;
        }
    
        /**
         *
         * @param s1
         * @param s2
         * @return
         */
        public static boolean isDiffOnlyOneChar(String s1, String s2) {
            int count = 0;
            for (int i = 0; i < s1.length(); i++) {
    
                if (count == 0 && s1.charAt(i) != s2.charAt(i)) {
                    count++;
                    continue;
                }
    
                if (count > 0 && s1.charAt(i) != s2.charAt(i)) {
                    return false;
                }
            }
    
            return count == 1 ? true : false;
        }
    }
    

     

     

    '코딩 테스트 > 프로그래머스' 카테고리의 다른 글

    [프로그래머스][Level3][JAVA] 이중우선순위큐  (2) 2021.02.07
    [프로그래머스][Level3][JAVA][등굣길]  (0) 2021.01.16
    [프로그래머스][Level3][2 x n 타일링]  (0) 2020.11.26
    [프로그래머스][Level2][JAVA] 방금 그 곡  (0) 2020.11.22
    [프로그래머스][Level2] 압축 - JAVA  (0) 2020.11.20
      '코딩 테스트/프로그래머스' 카테고리의 다른 글
      • [프로그래머스][Level3][JAVA] 이중우선순위큐
      • [프로그래머스][Level3][JAVA][등굣길]
      • [프로그래머스][Level3][2 x n 타일링]
      • [프로그래머스][Level2][JAVA] 방금 그 곡
      갓생사는 김초원의 개발 블로그
      갓생사는 김초원의 개발 블로그
      갓생사는 김초원의 개발 블로그 github: https://github.com/kimchowon

      티스토리툴바