본문 바로가기
Coding Test/JavaScript

[Javascript] (프로그래머스 level 1) 크레인 인형뽑기 게임

by Chaedie 2022. 7. 1.
728x90

[Javascript] (프로그래머스 level 1) 크레인 인형뽑기 게임

💡 구글에 Javascript 풀이가 많이 없거나, 배운 점이 있으면 포스팅합니다.

내 풀이

function solution(board, moves) {
    // 아래부터 차곡차곡 쌓여있다
    // 153에서 뽑아서 스택에 쌓는다.
    // 스택에 같은 인형 만나면 둘다 없어짐
    // 인형 없는 곳에 작동하면 아무일도 안일어남
    // 바구니 크기는 무한
    // 크레인 작동시킨 후 터뜨려 사라진 인형의 개수를 return 
    // board는 55이상 3030 이하
    // board 0은 빈칸, 1~100은 각각 인형 
    // moves 1~1000, 각 배열의 가로 줄  [1,5,3,5,1,2,1,4] 핑크 악어 볼 볼 악 무 핑

    const doll = {
        count : 0,
        stack : [],
        board : board,
    }
    // moves 배열을 실행한다. pickDoll(moves[i])
    for (let i = 0; i < moves.length; i++) {
        pickDoll(moves[i], doll);
    }
    // stack 체크 (투포인터) //ex [1,1,2,3,3,2,2,3,3,1,5,6]
    let dist = 1;
    for (let p1 = 0; p1 < doll.stack.length; p1++) {
        if (doll.stack[p1] <= 0) {
            dist = 1;
            continue;
        }
        if (doll.stack[p1] === doll.stack[p1 + dist]) {
            doll.count += 2;
            doll.stack[p1] = -1;
            doll.stack[p1 + dist] = -1
            //여기 예외처리가 힘들었음
            while(doll.stack[p1] === -1 && (p1 > 0)) {
                p1--;
            }
            while(doll.stack[p1 + dist] === -1 && (p1 + dist <= doll.stack.length)) {
                dist++;
            }
            p1--;
        }        
    }

    return doll.count;    
}

function pickDoll(column, doll) {
    let col = column - 1;

    // board의 column에 각 로우에 인형이 있는지 확인
    // 인형 있으면 0으로 만들고, 스택에 push
    for (let i = 0; i < doll.board.length; i++) {
        let pos = doll.board[i][col];
        if (pos === 0) {
            continue;
        } 
        doll.stack.push(pos);
        doll.board[i][col] = 0;
        // break 안해서 10분 날림
        break;
    }

    return;
}
  • 다른 사람 풀이

const transpose = matrix =>
    matrix.reduce(
        (result, row) => row.map((_, i) => [...(result[i] || []), row[i]]),
        []
    );

const solution = (board, moves) => {
    const stacks = transpose(board).map(row =>
        row.reverse().filter(el => el !== 0)
    );
    const basket = [];
    let result = 0;

    for (const move of moves) {
        const pop = stacks[move - 1].pop();
        if (!pop) continue;
        if (pop === basket[basket.length - 1]) {
            basket.pop();
            result += 2;
            continue;
        }
        basket.push(pop);
    }

    return result;
};
  • 와 미쳤다 👍
  • 1) 트랜스포즈라는 함수로 보드에서 필요없는 0을 빼서 탐색 시간을 줄임 (이게 진짜 대박이네 생각도 못했는데, 0이 졸라 많으면 왠 헛수고지 ? 했는데 좋은 방법이네.. )
  • 2) 나는 스택에 푸시하고 바로 같은놈체크하고 팝하면 안좋을 줄 알고 그랬는데, 나중에 while처리하고 하면서 힘들었음 근데 그냥 바로바로 스택에 넣자마자 팝하면 훨씬 편했음
  • 3) stack에 넣고 보드에서 뺄때도 보드에서 pop하면서 동시에 그 return값을 stack에 푸쉬해줌으로 2줄짜리를 1줄로 처리했다.

배운 점, 느낀 점

  • 아이디어 2가지가 다름으로 이렇게 좋은 코드가 나왔다는게 신기하다.
  • 나는 그냥 생각의 흐름대로 짠 코드라고 보여지고, 다른 사람 코드는 생각을 좀 더 깊게 하고 짠 코드같다. 굳굳

시간

  • 다행히 해설 안보고 직접 푸는데 1시간 안걸렸다. 물론 더 빨라져야 하는 시간이지만, 혼자 풀었는데 1시간이내로 풀었으면 내 실력에 비해 잘했다. 굳

댓글