알고리즘 문제 풀기

프로그래머스: [1차]프렌즈4블록 - javascript(그래프 이동, concat)

Fo_rdang 2024. 4. 13. 11:10
반응형

문제 출처 

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이 힌트 

그래프를 얼마나 잘 ~ 아는지 확인하는 문제였다. 

 

- 주어진 board를 2차원 배열로 변경 

- 2*2 가 다 똑같은 블록인지 체크하기 

- 2*2 인 블록은 0으로 채우기 

- 위에 문자가 있는 블록이고, 아래 빈 블록이면 문자 블록을 내려주기 . 

 

문제 풀이 코드 

function solution(m, n, board) {
    board = board.map(v => v.split(''));  // 문자열 배열을 2차원 배열로 변환

    while (true) {
        let arr = [];  // 제거할 블록의 좌표를 저장할 배열
        for (let i = 0; i < m - 1; i++) {
            for (let j = 0; j < n - 1; j++) {
                // 빈칸이 아니고, 2x2 블록이 모두 동일한 문자일 경우 해당 블록의 좌표를 저장
                if (board[i][j] && 
                    board[i][j] === board[i][j + 1] && 
                    board[i][j] === board[i + 1][j] && 
                    board[i][j] === board[i + 1][j + 1]) {
                    arr.push([i, j]);
                }
            }
        }

        // 제거할 블록이 없으면 남은 블록 중 빈칸(0)의 개수를 반환
        if (!arr.length) return [].concat(...board).filter(v => !v).length;

        // 2x2 블록을 0으로 설정하여 제거
        for (let i = 0; i < arr.length; i++) {
            let col = arr[i][0];
            let row = arr[i][1];
            board[col][row] = 0;
            board[col][row + 1] = 0;
            board[col + 1][row] = 0;
            board[col + 1][row + 1] = 0;
        }

        // 블록을 아래로 떨어뜨리기
        for (let i = m - 1; i >= 0; i--) {  // 아래에서부터 행을 순회
            for (let j = 0; j < n; j++) {  // 열을 순회
                if (board[i][j] === 0) {  // 현재 칸이 빈칸인 경우
                    for (let k = i - 1; k >= 0; k--) {  // 위쪽 행을 탐색
                        if (board[k][j] !== 0) {  // 블록이 있으면
                            board[i][j] = board[k][j];  // 현재 행으로 블록을 떨어뜨림
                            board[k][j] = 0;  // 원래 있던 위치를 0으로 설정
                            break;  // 다음 열로 이동
                        }
                    }
                }
            }
        }
    }
}

 

Only 의사 코드 

function solution(m, n, board) {
    board = board.map(v => v.split('')); 
    
    while(true){
    let arr = []; 
    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][j+1] &&
               board[i][j] === board[i+1][j] &&
               board[i][j] === board[i+1][j+1]
              ){
                arr.push([i, j])
            }
        }
    }
        if(!arr.length) return [].concat(...board).filter(v => !v).length; 
        
    for(let i=0; i<arr.length; i++){
        let col = arr[i][0];
        let row = arr[i][1];
        board[col][row] = 0 
        board[col][row+1] = 0 
        board[col+1][row] = 0 
        board[col+1][row+1] = 0 
    }
    for(let i=m-1; i>=0; i--){ 
       for(let j=0; j<n; j++){
           if(board[i][j] === 0){
               for(let k=i-1; k>=0; k--){
                   if(board[k][j] !== 0){
                       board[i][j] = board[k][j];
                       board[k][j] =  0;
                       break; 
                   }
               }
           }
       }
    }
}
}

 

 

알고가는 ppoint 

반응형