Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

[프로그래머스 Level 2] 프렌즈4블록 - JavaScript
연습장/프로그래머스 문제풀이

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

2022. 6. 10. 00:10

🔗 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/17679

 

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

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

programmers.co.kr

✏️ 풀이

function solution(m, n, board) {
    board = board.map(row => [...row]);
    const offset = [[0, 0], [0, 1], [1, 0], [1, 1]];
    
    let count = 0;
    let flag = true;
    while (flag) {
        flag = false;
        const target = [];
        for (let i = 0; i < m - 1; i++) {
            for (let j = 0; j < n - 1; j++) {
                const blocks = offset.map(([dx, dy]) => board[i + dx][j + dy]);
                if (blocks.every(block => !!block && block === blocks[0])) {
                    offset.map(([dx, dy]) => target.push([i + dx, j + dy]));
                    flag = true;
                }
            }
        }
        target.forEach(([x, y]) => {
            const block = board[x][y];
            if (block) {
                board[x][y] = '';
                count++;
            }
        });
        for (let i = 0; i < n; i++) {
            const stack = [];
            for (let j = 0; j < m; j++) {
                const block = board[j][i];
                if (block) {
                    stack.push(block);
                }
            }
            for (let j = m - 1; j >= 0; j--) {
                if (stack.length) {
                    board[j][i] = stack.pop();
                } else {
                    board[j][i] = '';   
                }
            }
        }
    }
    return count;
}

보드 전체를 순회하면서 4개 블록에 해당하는 좌표를 모두 구한다. 중복이 있더라도 일단 target 배열에 모두 담는다. 그리고 나서 target을 순회하면서 해당 좌표의 블럭이 비어 있지 않을 때에만 그 블럭을 비우고 count를 증가시킨다. 이렇게 하면 중복 관계 없이 없어진 블록만큼만 count를 증가시킬 수 있다.

 

그 다음에는 보드를 세로 - 가로가 아닌, 가로 - 세로 순서로 순회하면서 세로 줄에 있는 모든 블록을 stack에 담는다. stack에 담긴 블록들은 다시 세로를 역순으로 순회하면서 보드를 채워넣는다. stack이 비면 그 뒤 좌표는 모두 비운다.

즉, 위에서 아래로 순회하면서 stack에 블록을 담고, 다시 아래에서 위로 순회하면서 stack에 담긴 블록을 pop해서 아래부터 채워넣고, 남는 자리는 모두 비워서 블록이 아래로 쌓이는 것을 구현한 것이다.

 

위 과정을 계속 반복하다가 처음에 4개짜리 같은 블록이 단 한 개도 없을 때 while문을 탈출한다.

while문을 탈출한 시점에서의 count가 구하고자 하는 답이 된다.

저작자표시 비영리 (새창열림)

'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글

[프로그래머스 Level 2] 방금그곡 - JavaScript  (0) 2022.06.10
[프로그래머스 Level 3] 여행경로 - JavaScript  (0) 2022.06.10
[프로그래머스 Level 3] 네트워크 - JavaScript  (0) 2022.06.09
[프로그래머스 Level 2] 문자열 압축 - JavaScript  (0) 2022.05.25
[프로그래머스 Level 2] 위장 - JavaScript  (0) 2022.05.25
    '연습장/프로그래머스 문제풀이' 카테고리의 다른 글
    • [프로그래머스 Level 2] 방금그곡 - JavaScript
    • [프로그래머스 Level 3] 여행경로 - JavaScript
    • [프로그래머스 Level 3] 네트워크 - JavaScript
    • [프로그래머스 Level 2] 문자열 압축 - JavaScript
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바