ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JavaScript]무인도 여행
    JavaScript_알고리즘 2024. 9. 3. 14:53

    1. 문제

     

    https://school.programmers.co.kr/learn/courses/30/lessons/154540

     

    프로그래머스

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

    programmers.co.kr

     

     

    2. 접근 방법

     

    • 3 ≤ maps의 길이 ≤ 100
      3 ≤ maps[i]의 길이 ≤ 100
      maps[i]는 'X' 또는 1 과 9 사이의 자연수로 이루어진 문자열입니다.
      지도는 직사각형 형태입니다.
    • DFS

     

    3. 자바스크립트 코드

     

    function solution(maps) {
      let answer = [];
      //   행의 개수
      const rowLength = maps[0].length;
      //   열의 개수
      const columnLength = maps.length;
      //   방향 배열
      const direction = [
        [0, -1],
        [-1, 0],
        [0, 1],
        [1, 0],
      ];
      //   DFS함수
      const DFS = (x, y) => {
        // 칸을 움직이며 더해나가는 변수
        let total = 0;
        // 방문처리
        visited[x][y] = true;
        // 스택
        stack = [[x, y]];
        // 스택 길이가 0보다 클때까지
        while (stack.length > 0) {
          // stack 첫 인자 추출
          const [nextX, nextY] = stack.shift();
          //   Number로 변환 후 더해나감
          total += Number(maps[nextX][nextY]);
          //   방향배열
          for (let k = 0; k < 4; k++) {
            const nx = nextX + direction[k][0];
            const ny = nextY + direction[k][1];
            // 범위 내 존재
            if (0 <= ny && ny < rowLength && 0 <= nx && nx < columnLength) {
              // X 가 아니고 방문처리가 되지 않았을 경우
              if (maps[nx][ny] !== "X" && visited[nx][ny] === false) {
                // 방문 처리 후 스택에 저장
                visited[nx][ny] = true;
                stack.push([nx, ny]);
              }
            }
          }
        }
        // 더해나간 값 리턴
        return total;
      };
      // 2차원 배열 생성 (ES6부터 가능)
      let visited = Array.from(Array(columnLength), () =>
        Array(rowLength).fill(false)
      );
      // 배열 탐색
      for (let mapIndex = 0; mapIndex < columnLength; mapIndex++) {
        for (let index = 0; index < rowLength; index++) {
          // X가 아니고 방문하지 않았을 때
          if (maps[mapIndex][index] !== "X" && visited[mapIndex][index] === false) {
            answer.push(DFS(mapIndex, index));
          }
        }
      }
      // answer 변수에 숫자가 존재할 경우 sort 처리 아닐 경우 -1
      return answer.length ? answer.sort((a, b) => a - b) : [-1];
    }

     

    4. 문제를 풀고난 후 생각

     

    • JS 문제를 푸는데 있어서 Python으로 푸는 그대로 사용했다가 틀린 부분을 찾기 어려웠다.
    • Python 에서 sort 처리하면 그냥 순서를 오름차순 정렬을 해줬지만 JS의 경우 sort 내부에 인자가 없을 경우 문자열로 변환 후 정렬을 진행해주기 때문에 문제를 다 풀어놓고 정답을 맞추지 못했다.
    • 또한 for ... in ... 을 사용할 경우 index 값이 문자열로 오기 때문에 for .... in 대신 for (let i .... ) 을 사용해서 문제에 접근함

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • DFS
    • JS sort

    'JavaScript_알고리즘' 카테고리의 다른 글

    [JavaScript]호텔 대실  (1) 2024.09.05
    [JavaScript] 크기가 작은 부분 문자열  (0) 2024.08.07
    [JavaScript] 대충 만든 자판  (0) 2024.08.07

    댓글

Designed by Tistory.