본문 바로가기

주5일알고리즘

Programmers: 크레인 인형뽑기 게임 with JS

<내 풀이> - 못풀었다.

뽑아서 저장하는 것 까지는 어떻게 한거 같은데, 

그 후에 중복된걸 제거하는 부분에서 time이 over 되었다.

(중복된걸 제거할 때 [1,2,2,1]의 경우 2,2가 사라지고 1,1도 사라질 수 있는데, 그럴 때 어떻게 구현해야 할 지 감이 안잡힘)

function solution(board, moves) {
    var answer = 0;
    var samllbox = [];
    var box = [];
    var moves = moves.map(i => i-1); 

    for(var i = 0; i<moves.lenght; i++){
        for(var j = 0; j<5; j++){
            if(board[moves[i]][j]!=0){
                var k = [];
                k.push(j);
                smallbox.push(board[moves[i]][j]);
                }  
        }
        box.push(smallbox[0]);
        board[moves[i]][k[0]] = 0; //뽑아서 저장하느것까지 했음
    }
    
    return answer;
}

<다른 사람 풀이> 

function solution(board, moves) {
    let result = []; // 바구니
    let cnt = 0;
    
    for(let i=0; i<moves.length; i++){
        const peek = moves[i]-1; 
        for(let j=0; j<board.length; j++){
            if( board[j][peek] === 0 ) continue;
            else{
                const lastLength = result.length <= 1 ? 0 : result.length-1;                
                if(result[lastLength] === board[j][peek]){
                    board[j][peek] = 0;
                    result.splice(lastLength);
                    cnt += 2;
                }
                else{
                    result.push(board[j][peek]);
                    board[j][peek] = 0;
                }
                break;
            }
        }
    }
    return cnt;
}

전형적인 [2차원 배열 뽑기 문제]라고 함.

 

for문 두개 돌리고 if 문으로 조건 확인하는 거 까지의 흐름은 문제 없었음.

 

for 문에서 j = 0 부터 시작하면 위에서부터 뽑기 때문에 굳이 새로운 배열에 저장해놓을 필요없고, 

뽑은걸 바로 box에 넣으면서 이미 들어간 것과 비교해서 같으면 지우면 됨.

 

우려했던 [1,2,2,1] 같은 경우에도 예외처리를 안해줘도 되는게,

어차피 하나씩 넣기 때문에 2,2가 만들어질 때 box에서 최근 2개 지우도록 하면 [1]만 남게 됨. 

 

for 문 break 걸어서 맨위에거 나오고 box 처리까지 하고 나서는 종료되도록 하는 부분이 point.