어제의 나보다 성장한 오늘의 나

[프로그래머스][2018 KAKAO BLIND RECRUITMENT][자바스크립트] 프렌즈4블록 본문

알고리즘/프로그래머스(Programmers)

[프로그래머스][2018 KAKAO BLIND RECRUITMENT][자바스크립트] 프렌즈4블록

NineOne 2021. 5. 6. 23:12

programmers.co.kr/learn/courses/30/lessons/17679?language=javascript

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

function solution(m, n, board) {
  let answer = 0;
  const visited = Array.from(Array(m), () => new Array(n));
  board = board.map((arr) => arr.split(""));
  let limit = m * n;

  function checkFriends() {
    let flag = false;

    for (let i = 0; i < m - 1; i++) {
      for (let j = 0; j < n - 1; j++) {
        let target = board[i][j];
        if (target == 0) continue;
        if (board[i + 1][j] != target || board[i][j + 1] != target || board[i + 1][j + 1] != target)
          continue;

        visited[i][j] = visited[i + 1][j] = visited[i][j + 1] = visited[i + 1][j + 1] = true;
        flag = true;
      }
    }

    return flag;
  }

  function removeFriends() {
    for (let i = 0; i < m; i++) {
      for (let j = 0; j < n; j++) {
        if (visited[i][j] === undefined) continue;
        board[i][j] = 0;
        visited[i][j] = undefined;
        answer++;
      }
    }
  }

  function moveFriends() {
    for (let j= n-1; j>=0; j--) {
      for (let i = m-1; i >=0; i--) {
        if (board[i][j] == 0) {
          let index = 0;
          while (i - index >= 0) {
            if (board[i - index][j] == 0) {
                index++;
                continue;
            }
            board[i][j] = board[i - index][j];
            board[i - index][j] = 0;
            break;
          }
        }
      }
    }
  }

  while (checkFriends()) {
    removeFriends();

    if (limit <= answer) break;

    moveFriends();
  }

  return answer;
}

정리1. board를 순회하면서 4개짜리 블록을 찾는다.  (찾으면 해당 자리 visited[][] = true)
2. 저장한 배열을 순회하면 board에 0으로 표시를 해주고 answer를 증가시켜준다.
3. 배열을 아래로 내려준다.
4. 1번을 반복

Comments