article thumbnail image
Published 2022. 5. 21. 23:15

BFS

1.동작원리 = 큐
2.구현 방법= 큐 자료구조(선입선출FIFO구조) push와 shift를 사용해 자료구조를 구현한다.
3.최소값을 구하는 문제이기때문에 bfs가 더빠르다.
 
function solution(begin, target, words) {
    const visited = []
    const queue = []

    // 변환할 수 없는 경우
    if (!words.includes(target)) return 0 //words안에 타겟이 없을때 0을 반환한다.//2번째 테스트 케이스 통과
   //첫번째 테스트 케이스 통과하기위해 bfs를 사용하자
    queue.push([begin, 0])//큐 시작

    while(queue) {//큐를 이용해 반복문사용
        const [currentNode, count] = queue.shift()//큐에서 하나의 원소를 뽑아 출력 구조..분해...할당!
        visited.push(currentNode)//반복문을 돌때마다 방문한 노드를 visited에 넣어준다.
            console.log(currentNode) 
        if (currentNode === target) {//큐에서 뽑은 단어가 타겟에 있다면 카운트를 출력한다.
            
            return count
        }

        words.forEach((changeWord) => {//words의 각각의 요소에대하여 반복문을 돌려 diff를 0으로 정의해 바꼈는지 체크해준다.
            let diff = 0

            if (visited.includes(changeWord)) return // 만약 내가 넣은 현재노드에 바뀐 단어가 없다면 아래반복문 실행
   
            for (let i = 0; i < currentNode.length; i++) {
                if (currentNode[i] !== changeWord[i]) diff++
            
               
            }

            if (diff === 1) {
           
                queue.push([changeWord, count + 1])
            }
        })
        
    }
}

프로그래머스 단어변환 문제

 

DFS

1.스택(선입후출구조 or 후입선출구조  )
2.stack을 정의하고 push와 pop을 사용해 스택 자료구조를 구현하거나 재귀함수(자기자신을 호출하는 함수)를 이용한다
3.최대값을 구하는문제
function solution(tickets){
    let answer = [];  //가능한 루트들을 담을 배열

    function dfs (extra, cur,route ) {
    //3가지 인자를 받는다. 남은 티켓, 현재 위치, 배열
         if(extra.length===0){
         //extra의 길이가 0이라는 것은 tickets에 있는 티켓을 모두 사용했다는것.
         //그렇지 않을 경우엔 길이가 0이 될 수 없다.
             answer.push(route)
             //모두 사용했으니 route를 answer에 푸쉬해주자. 
         }
         else{
         //길이가 0이 아니라면 아직 티켓이 남았다는 얘기
             extra.forEach(([departure, destination], idx) => {
             //forEach문으로 구조분해할당으로 하나의 배열마다 접근하고, 인덱스 가져온다.
                if( cur === departure){
                // 항상 출발지는 같아야한다
                     const newTickets = [...extra]; //티켓을  복사
                     newTickets.splice(idx,1)   
                     //cur과같은 출발지가 있는 배열을 빼준 배열을 만든다.

                     dfs(newTickets, destination, route.concat(destination))
                  //하나가 빠진 배열과 데스티네이션, 도착지를 추가한 배열을 재귀돌린다.
                  //한바퀴를 돈 상태에선 다음과 같을거다.
                 }
             });
         }
     }
     dfs(tickets , "ICN" , ["ICN"])
     //초기값을 설정한다. 인천에서 출발하여야하니 현재위치에 인천을,
     //배열안에도 인천을 넣어준 상태로 출발
     return answer.sort()[0];
     //오름차순 정렬해서 첫번째 요소만 꺼낸다.
 }
 

프로그래머스 여행경로 문제를 통해 dfs를 구현해보았다.

'자료구조' 카테고리의 다른 글

[Stack, queue, tree]  (0) 2022.05.21
복사했습니다!