[프로그래머스] 프렌즈4블록 / JavaScript / Level 2

KimYoungWoong·2022년 11월 23일
0

Programmers

목록 보기
30/60
post-thumbnail

🚩문제 주소


📄풀이


구현

check4 함수

배열을 반복하여 4블록을 검사하여 같다면 지워야할 배열에 좌표를 추가합니다.
추가가 완료됐다면 지워야 하는 좌표를 배열에서 0으로 바꾼 후 개수를 세고 총 개수를 반환합니다.

fillEmpty 함수

배열의 밑에서부터 검사하는데 0이 하나라도 없다면 넘어갑니다.

검사하는 자리가 0이고 위로 올라가면서 검색하는데 0이 아니라면 서로 바꿔주고 바꿔진 자리는 0으로 바꿉니다.
  • check4 함수와 fillEmpty 함수를 반복 실행
    • 지워진 블록이 있으면 정답에 더하기
    • 지워진 블록이 없으면 정답을 반환


👨‍💻코드


const check4 = (arr) => {
  const erase = [];
  let cnt = 0;
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr[0].length - 1; j++) {
      if (arr[i][j] && arr[i][j] === arr[i + 1][j] && arr[i][j] === arr[i][j + 1] && arr[i][j] === arr[i + 1][j + 1]) {
        erase.push([i, j]);
        erase.push([i + 1, j]);
        erase.push([i, j + 1]);
        erase.push([i + 1, j + 1]);
      }
    }
  }
  for (let i = 0; i < erase.length; i++) {
    [a, b] = [erase[i][0], erase[i][1]];
    if (arr[a][b] != 0) {
      arr[a][b] = 0;
      cnt++;
    }
  }

  return cnt;
};

const fillEmpty = (arr) => {
  for (let i = arr.length - 1; i > 0; i--) {
    if (!arr[i].some((v) => !v)) continue;
    for (let j = 0; j < arr[0].length; j++) {
      for (let k = i - 1; k >= 0 && !arr[i][j]; k--) {
        if (arr[k][j]) {
          arr[i][j] = arr[k][j];
          arr[k][j] = 0;
          break;
        }
      }
    }
  }
};

function solution(m, n, board) {
  let answer = 0;
  board = board.map((v) => v.split(""));
  while (true) {
    const total = check4(board);
    fillEmpty(board);
    if (total != 0) {
      answer += total;
    } else return answer;
  }
}

profile
블로그 이전했습니다!! https://highero.tistory.com

0개의 댓글