[JS][프로그래머스 -LEVEL 2 - [1차] 프렌즈4블록]

정대만·2023년 7월 6일

코딩테스트

목록 보기
18/51
post-thumbnail

문제풀이

1)

-> 2x2 으로 블록을 잡는다. 이때 겹치는 부분도 있으니 겹치는 부분은 count 해주면 안되다.

-> 밑에서부터 내려와야되기때문에 생각을 좀 많이 했다. 처음에는 시작하는 부분과 끝나는 부분을 구해서 slice 으로 나눈뒤 합칠까 생각을햇다가 어쩌피 구하는것은 같은 부분이 아닌 것을 세로로 구하는거기 때문에 for 문을 돌려서 구했다.


-> 한번실행후 다시 실행해야되기 때문에 while (true) 를 실행해서 if 문으로 빠져나가는 식을 세웠다.

내 풀이

  • board_arr : 2차원 배열로 만든 공식
  • heyfind : 나를 기준으로 옆 밑 대각선으로 가서 총 갯수가 3 개 인 경우를 찾는 함수
  • check_xx : hey_find 으로 찾은 배열의 y,x 좌표를 옆 밑 대각선을 'x' 으로 설정해준다.
  • go_sero: 밑으로 내려가는 함수 기준이 "가로" 가 아닌 "세로" 이기 때문에
    밑으로 가면서 'X' 표시가 안된 배열을 잡고 안된배열을 카운트한뒤 다시 채워주는 함수이다. 이때 우리가 갔던 부분은 다시 카운트하면 안되므로 null 을 둔다.
    null != null 이기 때문에 null로 세팅해주었다.
function solution(m, n, board) {
    var board_arr= Array.from(Array(m), () => Array(n-1).fill(null));
 
    
    for(var i=0; i<m; i++){
       var nn= board[i].split('');
        
        for(var zz=0; zz<nn.length; zz++){
            board_arr[i][zz]=nn[zz];
        }
    }
  

    var answer = 0;
    var yy=[0,+1,+1];
    var xx=[+1,+1,0];
    var gogo=[];
    
     // 찾는 함수 
    const heyfind= function(y,x,ima){
        var count=0;
        for(var i=0; i<3; i++){
            var new_y= y+yy[i];
            var new_x= x+xx[i];
            if(new_y>-1 &&new_y <m && new_x >-1 && new_x<n){
              if(board_arr[new_y][new_x]!=ima)
                  {
                      return;
                  }
            if(board_arr[new_y][new_x]==ima){
                count+=1;
            }
            }
        }
        if(count==3){
            gogo.push([y,x]);
        }
      
    }
    const check_xx= function(y,x){
           board_arr[y][x]='X';
 answer+=1;
          for(var i=0; i<3; i++){
            var new_y= y+yy[i];
            var new_x= x+xx[i];
             if( board_arr[new_y][new_x]!='X'){
                board_arr[new_y][new_x]='X';
    
            answer+=1;
               }
           
        }
    }
    const go_sero= function(what_col){
      //음//splice 으로 그냥 잘라버리고 걍 새로 붙이자 
        var new_Sero=[];
        for(var sero=0; sero<m; sero++){
             if(board_arr[sero][what_col]!='X'){
                 new_Sero.push(board_arr[sero][what_col])
             }
        }
        if(new_Sero.length < m){
        for(var i=0; i<m; i++){
              if(i<m-new_Sero.length){
               board_arr[i][what_col]=null;
            }
               else{
            board_arr[i][what_col]=new_Sero.shift();
               }
            }

}
    }
  
    var count=0;
    while(true){
        
         for(var gogo_y=0; gogo_y<m; gogo_y++){
         for(var gogo_x=0; gogo_x<n ; gogo_x++){
             if( board_arr[gogo_y][gogo_x]){

             heyfind(gogo_y,gogo_x,board_arr[gogo_y][gogo_x]);
         }
}
          }  //여기서 다 넣어줌
        
        if( gogo.length==0){
            break;
        } 
           
          if(gogo.length>0){
            while(gogo.length>0){
             var [yyy,xxx]=gogo.pop();
             check_xx(yyy,xxx);
               }
           }
          for(var goxxx=0; goxxx<n; goxxx++){
               go_sero(goxxx);
          }  
  
    }


    return answer;
}
profile
안녕하세요

0개의 댓글