sggnology
하늘속에서IT
sggnology
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • Algorithm (31)
      • Programmers (27)
      • Baekjoon (4)
    • WIKI (4)
      • VirtualBox (1)
      • Power Toys (1)
    • NodeJS (4)
      • nvm (1)
      • React (1)
      • Vue (1)
    • Dev Language (3)
      • Java (2)
      • Kotlin (1)
    • Spring Boot (17)
      • Gradle (1)
      • JPA (3)
    • DB (4)
      • MariaDB (3)
      • Redis (0)
    • Android (6)
      • Debug (3)
    • Nginx (3)
      • Debug (1)
    • Intellij (0)
    • Network (1)
    • Git (2)
      • GitHub (2)
    • Chrome Extension (0)
    • ETC (5)
      • Monitoring (2)
    • Linux (1)
      • WSL (1)
    • Visual Studio (1)
    • Side Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • java
  • 안드로이드 스튜디오
  • mariadb
  • 레벨3
  • 연습문제
  • JPA
  • 프로그래머스
  • 티스토리챌린지
  • docker
  • spring boot
  • kotlin
  • 고득점 Kit
  • Android Studio
  • 알고리즘
  • 백준
  • 고득점KIT
  • 오블완
  • DB
  • nginx
  • 레벨2

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sggnology

하늘속에서IT

Algorithm/Programmers

Programmers :: 고득점 kit :: DFS/BFS :: 단어변환

2022. 10. 30. 17:03
728x90

풀이

class Solution {
    fun solution(begin: String, target: String, words: Array<String>): Int {
        val answerList = mutableListOf<Int>()

        /**
         * 설명
         * - target 이 words 에 포함되지 않는다면 해결방법은 없을것이다.
         * */
        if(words.contains(target).not()){
            return 0
        }

        val visited = BooleanArray(words.size){false}

        DFS(begin, target, answerList, words, visited, 0)

        return answerList.minOf { it }
    }

    private fun DFS(cmpValue: String, target: String, answerList: MutableList<Int>, words: Array<String>, visited: BooleanArray, count: Int){

        val copiedVisited = mutableListOf<Boolean>()
        copiedVisited.addAll(visited.toList())

//        if(getCheckWords(words, visited).isEmpty()) return
        /**
         * 설명
         * - 더이상 방문할 수 있지 않다면 재귀를 멈춘다.
         * */
        if(visited.none{ it.not() }) return

        /**
         * 설명
         * - 방문하지 않은 word 가 있다면
         * - 그 word 가 cmpValue 와 하나의 character 만 다른 값이라면
         * - 이때 target 과 바뀌고자 하는 값(word) 가 같다면, answerList 에 횟수를 추가하고 재귀를 멈춘다.
         * - 이때 .. 다르다면, 재귀를 발생시킨다.
         * */
        for((wordIndex, word) in words.withIndex()){
            if(visited[wordIndex].not()){
                if(isSingleDifferentBetweenValues(cmpValue, word)){
                    val newCount = count + 1
                    copiedVisited[wordIndex] = true

                    if(word == target) {
                        answerList.add(newCount)
                        return
                    }
                    else{
                        DFS(word, target, answerList, words, copiedVisited.toBooleanArray(), newCount)
                    }
                }
            }
        }
    }

    /**
     * 설명
     * - var1, var2 두개의 단어가 한개만 다른 단어일 경우를 확인하는 함수
     * */
    private fun isSingleDifferentBetweenValues(var1: String, var2: String): Boolean{
        var count = 0
        for(index in var1.indices){
            if(var1[index] != var2[index]) count++

            if(1 < count) return false
        }

        return count == 1
    }

    /**
     * 설명
     * - 밑의 2개의 함수는 더이상 바뀔 수 있는 경우의 수가 없을 경우를 대비해서 작성하였지만 사용하지 않고도 해결되었다.
     * */

    /**
     * 설명
     * - 방문하지 않은 words 중에 cmpValue 가 변화하면 도달할 수 있는 값이 있는지를 확인하는 함수
     * */
    private fun isThereChangeAbleValueExist(cmpValue: String, words: Array<String>, visited: BooleanArray): Boolean{
        val checkWords = getCheckWords(words, visited)

        return checkWords.map { isSingleDifferentBetweenValues(cmpValue, it) }.none { it }.not()
    }

    /**
     * 설명
     * - words 에서 방문한(visited) 경우를 제외한 Array 를 반환하는 함수
     * */
    private fun getCheckWords(words: Array<String>, visited: BooleanArray): Array<String>{
        return words.filterIndexed{ index, _ -> visited[index].not()}.toTypedArray()
    }
}

출처

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이 github

 

GitHub - sggnology/programmers-algorithm: 프로그래머스 알고리즘 코드 정리입니다.

프로그래머스 알고리즘 코드 정리입니다. Contribute to sggnology/programmers-algorithm development by creating an account on GitHub.

github.com

 

728x90

'Algorithm > Programmers' 카테고리의 다른 글

프로그래머스 :: 연습문제 :: 숫자 카드 나누기  (0) 2022.11.11
Programmers :: 연습문제 :: 우박수열 정적분  (0) 2022.11.07
Programmers :: 연습문제 :: 롤케이크 자르기  (0) 2022.10.24
Programmers :: 고득점 kit :: 이중우선순위큐  (0) 2022.09.21
Programmers :: 연습문제 :: 최솟값  (0) 2022.09.17
    'Algorithm/Programmers' 카테고리의 다른 글
    • 프로그래머스 :: 연습문제 :: 숫자 카드 나누기
    • Programmers :: 연습문제 :: 우박수열 정적분
    • Programmers :: 연습문제 :: 롤케이크 자르기
    • Programmers :: 고득점 kit :: 이중우선순위큐
    sggnology
    sggnology
    하늘은 파란색이니까 내 삶도 파란색이길 ㅎㅎ

    티스토리툴바