본문 바로가기

프로그래머스/구현

[구현] 프로그래머스 '프렌즈4블록' - js

반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

2. 코드

진짜 빡구현 문제.. 이런게 코테에 나오면... 눈물 쓱.. 빡구현 문제 많이 연습해놔야겠다.

function solution(m, n, board) {
    let answer = 0;
    const newB = [];
    
    for(let i=0;i<board.length;i++){
        let temp = [];
        for(let j=0;j<board[i].length;j++){
            temp.push([board[i][j],0]);
        }
        newB.push(temp);
    }
    
    while(true){
        let cur = 0;
        // 같은 블록 찾기
        for(let i=0;i<m-1;i++){
            for(let j=0;j<n-1;j++){
                if(newB[i][j].length && newB[i+1][j].length && newB[i][j][0] === newB[i][j+1][0] 
                   && newB[i][j][0] === newB[i+1][j][0] && newB[i+1][j][0] === newB[i+1][j+1][0]){
                    if(!newB[i][j][1]){
                      newB[i][j][1] = 1;
                      cur++;
                    }
                  if(!newB[i][j+1][1]){
                      newB[i][j+1][1] = 1;
                      cur++;
                    }
                  if(!newB[i+1][j][1]){
                      newB[i+1][j][1] = 1;
                      cur++;
                    }
                  if(!newB[i+1][j+1][1]){
                      newB[i+1][j+1][1] = 1;
                      cur++;
                    }
                }
            }
        }
        // 윗 블록 내리기
        for(let i=0;i<m;i++){
            for(let j=0;j<n;j++){
                if(newB[i][j][1] && i === 0){
                    newB[i][j] = [];
                }else if(newB[i][j][1] && i > 0){
                    newB[i][j] = [...newB[i-1][j]];
                    newB[i-1][j] = [];
                }
            }
        }
        // 빈 곳 채우기
        for(let i=m-1;i>0;i--){
            for(let j=0;j<n;j++){
                if(!newB[i][j].length){
                    for(let k=i-1;k>=0;k--){
                        if(newB[k][j].length){
                            newB[i][j] = [...newB[k][j]];
                            newB[k][j] = [];
                            break;
                        }
                    }
                }
            }
        }
        answer += cur;
        
        if(!cur) break;
    }
    
    return answer;
}

처음엔 5번 테케만 자꾸 틀렸다. 구글링을 하다가 반례 테케를 찾았다.

https://dev-note-97.tistory.com/105

 

[프로그래머스] [1차] 프렌즈4블록 / Python / 반례

문제주소 :programmers.co.kr/learn/courses/30/lessons/17679 더보기 문제 설명 프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌

dev-note-97.tistory.com

8, 5, ['HGNHU', 'CRSHV', 'UKHVL', 'MJHQB', 'GSHOT', 'MQMJJ', 'AGJKK', 'QULKK']
> 8

나는 위 테케가 자꾸 4로 나왔다. 문제는 블록 사이사이를 메꿔주는 코드가 잘못되었던 것이다! 이 부분 수정하니 성공!

 

복기

6/7
반응형