[JS] 코딩테스트 고득점 Kit - DFS/BFS한번에 정리하기

2024. 9. 25. 17:59·알고리즘/프로그래머스
반응형
코테에 level 3이상은 안나오는 관계로, 먼저 level 2까지의 문제만 정리하고 차후 level3도 추가하겠습니다!


타겟넘버 level 2

function solution(numbers, target) {
    let count = 0;

    //변하는 값: index, curSum
    const dfs = (index, curSum) => {
        if(index == numbers.length){
            if(curSum == target)count++;
            return;
        }
        dfs(index+1, curSum + numbers[index]);
        dfs(index+1, curSum - numbers[index]);
    }
    dfs(0, 0);

    return count;

}

 

1. 함수 정의

  • 입력으로 numbers 배열과 target 숫자를 받습니다.

2. 변수 초기화

  • count라는 변수를 0으로 초기화합니다. 이는 목표 숫자를 만드는 방법의 수를 세는 데 사용됩니다.

3. DFS (깊이 우선 탐색) 함수 정의

  • dfs(index, curSum)이라는 내부 함수를 정의합니다.
  • index: 현재 처리 중인 숫자의 인덱스
  • curSum: 현재까지의 합계

4. DFS 함수 로직

기저 조건:

  • if(index == numbers.length): 모든 숫자를 처리했는지 확인합니다.
  • 만약 모든 숫자를 처리했고, curSum이 target과 같다면 count를 증가시킵니다.
  • 그리고 함수를 종료합니다.

재귀 호출:

  • 현재 숫자를 더하는 경우: dfs(index+1, curSum + numbers[index])
  • 현재 숫자를 빼는 경우: dfs(index+1, curSum - numbers[index])

5. DFS 시작

  • dfs(0, 0)을 호출하여 탐색을 시작합니다.
  • 초기 인덱스는 0, 초기 합계는 0입니다.

6. 결과 반환

  • 모든 탐색이 끝나면 count를 반환합니다.

 

게임맵 최단거리 level 2

function solution(maps) {
    let xSize = maps[0].length;
    let ySize = maps.length;

    let queue = [[0, 0, 1]]; // [curX, curY, curNum]
    maps[0][0] = 0; // 시작점 방문 표시

    while (queue.length > 0) {
        let [curX, curY, curNum] = queue.shift();

        if (curX === xSize - 1 && curY === ySize - 1) {
            return curNum; // 도착점에 도달
        }

        // 4방향 탐색
        let directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
        for (let [dx, dy] of directions) {
            let nextX = curX + dx;
            let nextY = curY + dy;

            if (nextX >= 0 && nextX < xSize && nextY >= 0 && nextY < ySize && maps[nextY][nextX] === 1) {
                queue.push([nextX, nextY, curNum + 1]);
                maps[nextY][nextX] = 0; // 방문 표시
            }
        }
    }

    return -1; // 도달할 수 없는 경우
}

 

1. 함수 정의:

  • solution(maps)라는 함수가 정의되어 있습니다.
  • 입력으로 2차원 배열 maps를 받습니다.

2. 변수 초기화:

  • xSize: 맵의 가로 크기 (열의 수)
  • ySize: 맵의 세로 크기 (행의 수)
  • queue: 시작점 [0, 0, 1]을 포함하는 배열 (x좌표, y좌표, 현재까지의 이동 횟수)

 

3. BFS (너비 우선 탐색) 시작:

  • 시작점을 방문했다고 표시 (maps[0][0] = 0)
  • queue가 비어있지 않은 동안 반복:

 

4. BFS 주요 로직:

a. 큐에서 현재 위치 정보를 가져옴:

  • curX, curY: 현재 x, y 좌표
  • curNum: 현재까지의 이동 횟수

b. 도착 확인:

  • 현재 위치가 맵의 오른쪽 아래 끝이면 curNum 반환

c. 4방향 탐색:

  • 상, 하, 좌, 우 네 방향에 대해 다음 위치 계산
  • 각 방향에 대해:
    • 다음 위치가 맵 안에 있고, 갈 수 있는 곳(1)인지 확인
    • 조건을 만족하면 큐에 새 위치 추가 ([nextX, nextY, curNum + 1])
    • 해당 위치를 방문했다고 표시 (maps[nextY][nextX] = 0)

5. 결과 반환:

  • 모든 탐색이 끝났는데도 도착점에 도달하지 못했다면 -1 반환

 

반응형

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[JS] 코딩테스트 고득점 Kit - 힙 한번에 정리하기  (0) 2024.09.25
[JS] 코딩테스트 고득점 Kit - 완전탐색 한번에 정리하기  (0) 2024.09.12
[JS] 코딩테스트 고득점 Kit - 스택/큐 한번에 정리하기  (3) 2024.09.10
[JS] 코딩테스트 고득점 Kit - 정렬 한번에 정리하기  (1) 2024.09.06
[JS] 코딩테스트 고득점 Kit - 해시 한번에 정리하기  (5) 2024.09.05
'알고리즘/프로그래머스' 카테고리의 다른 글
  • [JS] 코딩테스트 고득점 Kit - 힙 한번에 정리하기
  • [JS] 코딩테스트 고득점 Kit - 완전탐색 한번에 정리하기
  • [JS] 코딩테스트 고득점 Kit - 스택/큐 한번에 정리하기
  • [JS] 코딩테스트 고득점 Kit - 정렬 한번에 정리하기
분주
분주
bunju20 님의 블로그 입니다.
  • 분주
    개발자의 분주한 하루
    분주
  • 전체
    오늘
    어제
    • 분류 전체보기 (28)
      • 회고 (17)
        • 프로젝트 회고 (5)
        • 우아한테크코스 (12)
      • 알고리즘 (7)
        • 프로그래머스 (6)
      • 프론트엔드 (3)
        • Flutter (1)
      • 일상 (0)
        • 독서 (0)
      • 공부 (1)
        • 우아한테크코스 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    js
    우테코프론트엔드
    코딩테스트 고득점 Kit
    우아한테크코스
    회고
    우테코 프리코스
    우테코
    우아한테크코스프론트엔드
    프로그래머스
    우테코 프론트엔드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
분주
[JS] 코딩테스트 고득점 Kit - DFS/BFS한번에 정리하기
상단으로

티스토리툴바