프로그래머스 크레인 인형뽑기 게임 (21.10.10)

김도형 (르베니아)·2021년 12월 10일
0

TIL

목록 보기
35/38

문제이해

2차원 배열이 주어진다.
0은 인형이 없는것을 표시
0이상은 인형을 표시한다

첫번째로 인형을 뽑는 함수를 만든다
두번째로 몇번 x좌표에서 인형을 뽑는다.
세번째로 인형이 뽑히면 스택에 저장
네번째로 인형을 저장하기전에 스택의 탑과 뽑은 인형이 같으면 넣지않고 스택을 팝
다번째로 인형을 뽑았으니 카운트를 +2

함수

일단 현재의 배열에서 y의 깊이가 어느정도인지 구해야된다.

let yl = board[0].length;

그리고 반복문을 돌아서 인형이 있을때 까지 돌고
만약에 인형이 있으면 그 인형의 값을 리턴

    let yl = board[0].length;
    for(let i = 0; i < yl; i++){
        let re = board[i][num];
        if(re !== 0){
  
            return re;
        }
    }

여기서 끝이 아니고 인형을 뽑았으니 해당 배열을 비워줘야된다

board[i][num] = 0;

그리고 인형을 못뽑으면 반복문이 다돌았다는 뜻이며
return 을 안했다는 뜻이며 인형을 못뽑았다는 뜻이다.
함수의 끝에서 0을 리턴해주자

return 0;

함수 전체 코드

function up(num, board) {
    let xl = board.length;
    let yl = board[0].length;
    for(let i = 0; i < yl; i++){
        let re = board[i][num];
        if(re !== 0){
            board[i][num] = 0;
            return re;
        }
    }
    return 0;
}

실행하자!

이제 X좌표와 해당 배열을 함수에 넘겨주면
해당 x좌표에서 뽑은 인형을 리턴해준다.
해당 좌표에서 인형을 뽑았다면 0이 아닌값이 나온다.
다음 스택에 저장하기전에 해당 스택의 탑을 확인
스택의 탑과 같으면 스택에서 pop을 해주고
카운트를 증가
스택의 탑과 뽑은 인형이 다르다면 해당 인형을 스택에 push

    for(let a of moves){
        let check = up(a-1, board);
        if(check == 0){
            break;
        }
        if(stack[stack.length-1] == check){
            stack.pop()
            answer += 2;
        }else{
            stack.push(check)
        }
    }

완료...!

전체 코드

///입력 예시
let board = [[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]];
let moves = [1,5,3,5,1,2,1,4];


function up(num, board) {
    let xl = board.length;
    let yl = board[0].length;
    for(let i = 0; i < yl; i++){
        let re = board[i][num];
        if(re !== 0){
            board[i][num] = 0;
            return re;
        }
    }
    return 0;
}


function solution(board, moves) {
    var answer = 0;
    let stack = [];
    for(let a of moves){
        let check = up(a-1, board);
        if(check == 0){
            break;
        }
        if(stack[stack.length-1] == check){
            stack.pop()
            answer += 2;
        }else{
            stack.push(check)
        }
    }
    return answer;
}

잡담..

문제를 푸는데 읽는 것만 40분이 걸렷다..
이번 문제는 쉬웠던것 같다..
이전에 문제를 많이 풀어서 그런가?
의식의 흐름대로 문제를 풀었는데 막히는 곳이 없어서 행복
결국 코드 짜는건 10분 ~ 20분 걸린듯...

profile
한다. 간다. 해낸다.

0개의 댓글