[프로그래머스] 크레인 인형뽑기 게임

SeHoony·2022년 8월 19일
1

코테준비

목록 보기
10/27

1. 문제

크레인 인형 뽑기 게임
https://school.programmers.co.kr/learn/courses/30/lessons/64061

2. 기존 풀이

function solution(board, moves) {
    var answer = 0;
    const stack = []
    const removed = []
    moves.map(e => {
        for(let i = 0; i < board.length ; i++){
            if(board[i][e-1] !== 0){
                stack.push(board[i][e-1])
                board[board.indexOf(board[i])][e-1] = 0
                
                if(stack[stack.length-1] === stack[stack.length-2]){
                    removed.push(stack.pop())
                    removed.push(stack.pop())
                }
                break
            }
        }
    })
    answer = removed.length
    return answer;
}

문제의 글이 길어서 감을 못 잡았는데,,, 정말 어렵지 않은 문제였다.
문제의 핵심은 뽑은 인형 배열과 사라진 인형 배열을 관리하는 것이라고 생각한다.

그래서 각각 stackremoved로 배열을 선언했다.

그리고 이 후에 moves 배열에서 크레인의 이동 포인트를 map함수로 뽑아서, board 배열을 돌며 그 값이 0이면 다음으로 넘기고 0이 아니면 stack배열에 넣는다.

stack배열에 넣을 때 그 배열 내에서 사라지는 값이 있으면 remove배열에서 따로 관리해주면 된다.

왜 오래 걸렸을까...

3. 개선 풀이

function solution(board, moves) {
    var answer = 0;
    const stack = []
    let count = 0
    
    moves.map(e => {
        for(let i = 0; i < board.length ; i++){
            if(board[i][e-1] !== 0){
                
                if(stack[stack.length-1] === board[i][e-1]){
                    stack.pop()
                    count +=2
                }
                else{
                    stack.push(board[i][e-1])
                    
                }
              board[board.indexOf(board[i])][e-1] = 0
                break
            }
        }
    })
    answer = count
    return answer;
}

코드 개선이라고 생각했는데, 효율성의 개선은 이루어지지 않은 것 같은 느낌?(밑의 속도를 보라)

일단 위에서는 일단 크래인으로 인형을 뽑으면 stack에 쌓이게 했는데,
그 과정을 없애고 stack에 들어가기 전에 조건을 걸어서
stack의 마지막 인형이 지금 뽑힌 인형과 같은 지 확인하여 처리하도록 바꿨다.

[문제풀이 1]

[문제풀이 2]

profile
두 발로 매일 정진하는 두발자, 강세훈입니다. 저는 '두 발'이라는 이 단어를 참 좋아합니다. 이 말이 주는 건강, 정직 그리고 성실의 느낌이 제가 주는 분위기가 되었으면 좋겠습니다.

0개의 댓글