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

2025. 3. 18. 12:39·알고리즘

문제 출처

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제 설명

프렌즈4블록

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


만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다.

블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.

만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.

위 초기 배치를 문자로 표시하면 아래와 같다.

TTTANT
RRFACC
RRRFCC
TRRRAA
TTMMMF
TMMTTJ

각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다

입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.

입력 형식

  • 입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
  • 2 ≦ n, m ≦ 30
  • board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.

출력 형식

입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.

입출력 예제

예제에 대한 설명

  • 입출력 예제 1의 경우, 첫 번째에는 A 블록 6개가 지워지고, 두 번째에는 B 블록 4개와 C 블록 4개가 지워져, 모두 14개의 블록이 지워진다.
  • 입출력 예제 2는 본문 설명에 있는 그림을 옮긴 것이다. 11개와 4개의 블록이 차례로 지워지며, 모두 15개의 블록이 지워진다.

풀이 방법

  • 전체적인 풀이 방법은 아래와 같이 풀었다.
1. board를 2차원 배열로 변환시키기
2. 오른쪽, 아래, 오른쪽 아래를 보고 문자열이 같은 경우 파괴할 블록에 넣어주기(선 처리하면, 나중에 겹치는 블럭을 처리 못하므로 다른 배열에 넣어야 함)
3. 해당 블럭 0으로 처리
★4. 파괴한 블럭을 메꾸어야하는데, 이때 행을 기준으로 아래부터 탐색하여 같은 행에 0이 없는 경우는 재정렬을 수행하지 않아도 된다.
4-1 만약 재정렬을 해야하는 경우 (마지막부터)0이 처음 나오는 부분과 block이 나오는 부분을 찾아 서로 교체해준다.
5. 이후 파괴할 블럭이 없을 때 까지 무한 반복 수행....

풀이 코드

function solution(m, n, board) {
    //배열로 변환하기
    board = board.map((x) => x.split(""));
    
    while(true){
        let blocks = [];
        
        for(let i = 0; i < m - 1; i++){
            for(let j = 0; j < n - 1; j++){
                if(board[i][j] && board[i][j] === board[i + 1][j] && board[i][j] === board[i][j + 1] && board[i][j] === board[i + 1][j + 1]){
                    blocks.push([i, j]);
                }
            }
        }
        
        //파괴할 블록이 없으면
        if(blocks.length === 0){
            return [].concat(...board).filter((x) => !x).length;
        }
        
        for(let elements of blocks){
            let [i, j] = elements;    
            board[i][j] = 0;
            board[i + 1][j] = 0;
            board[i][j + 1] = 0;
            board[i + 1][j + 1] = 0;
        }
        
        for(let i = m - 1; i >= 0; i--){
            if(!board[i].some((x) => !x)){
                continue;
            }
            
            for(let j = 0; j < n; j++){
                let zeroCount = [];
                let blockCount = [];
                
                for(let k = m - 1; k >= 0; k--){
                    if(board[k][j] === 0){
                        zeroCount.push(k);
                    }
                    else{
                        blockCount.push(k);
                    }
                }
                
                //세로 줄 중 하나라도 0이 아닌경우
                if(zeroCount.length !== m){
                    for(let zero in zeroCount){
                        for(let block in blockCount){
                            if(zeroCount[zero] > blockCount[block]){
                                board[zeroCount[zero]][j] = board[blockCount[block]][j];
                                board[blockCount[block]][j] = 0;
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
}

결과

회고

  • some의 역할을 알아갔다...

참고 자료

https://velog.io/@kimjiwonpg98/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%94%84%EB%A0%8C%EC%A6%884%EB%B8%94%EB%A1%9D-javascript

저작자표시 비영리 동일조건 (새창열림)

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

[프로그래머스] 산 모양 타일링 - Java  (1) 2025.03.19
[백준] 타일 채우기 - Java  (1) 2025.03.19
[백준] 뱀 - Java  (1) 2025.03.17
[백준] 욕심쟁이 판다 - Java  (1) 2025.03.11
[백준] 색종이 붙이기 - Java  (1) 2025.03.07
'알고리즘' 카테고리의 다른 글
  • [프로그래머스] 산 모양 타일링 - Java
  • [백준] 타일 채우기 - Java
  • [백준] 뱀 - Java
  • [백준] 욕심쟁이 판다 - Java
BGK97
BGK97
사용자 입장에서 한번 더 생각하는 개발자로 성장하고 싶은 사람입니다.
  • BGK97
    꾸준히, 열심히
    BGK97
  • 전체
    오늘
    어제
    • 분류 전체보기 (111)
      • 알고리즘 (73)
      • 컴퓨터 구조와 운영 체제(책) (8)
      • 네트워크 (5)
      • React (10)
      • 경험한 에러들 (3)
      • HTML, CSS, JavaScript (8)
      • 자료구조 (1)
      • 이것이 컴퓨터 과학이다(책) (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BGK97
[프로그래머스] 프렌즈 4 블록 - JavaScript
상단으로

티스토리툴바