본문 바로가기

CS/알고리즘

크레인 인형뽑기 게임

만든 답 ! 정답~

function solution(board, moves) {
	const bucket = [];
	let result = 0;

	for (const m of moves) {		// 1번 loop
		for (let b = 0; b < board.length; b++) {	// 2번 loop
			if (board[b][m-1] > 0) {	// "m-1" 체크
				if (bucket[bucket.length -1] === board[b][m-1]) { // bucket 값의 맨위와 새로들어오는 값을 비교해야함.
					result += 2;
					bucket.pop();
				} else {
					bucket.push(board[b][m-1]); // 같은 값이 아니면 push.
				}
				board[b][m-1] = 0; //  board에서 뽑은 값은 0으로 변경.
				break;
			}
		}
	}
	return result;
}
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]]

moves = []

생각의 흐름

"move의 값에 따라 나뉘겠다."

1 ->board[x][0]

2 ->board[x][1]

3 ->board[x][2]

4 ->board[x][3]

5 ->board[x][4]

"이렇게 하면 크레인이 각각 move 위치에서 내려가는 행동이 되겠구나."

"x를 loop 돌려야겠다 !"

어디까지 x를 돌려야 하나? => board.length까지. 2차원 값은 이미 정해져있으니 1차원의 길이까지만 돌리면 크레인이 끝까지 내려가는 것이다.

for (let b = 0; b < board.length; b++) { }

"move도 loop를 돌려야된다. !"

move는 흔한 for문(i++)이 아니라 "for (x of array)" 형식으로 돌려야 한다.

 for (const m of moves) { }

 

"board[ ][ ]의 값이 0이면 인형이 없는 것이다."

만약 0이 아니라면 그 값을 bucket에 넣는다.

if (board[b][m-1] > 0) {
	bucket.push(board[b][m-1]);
	board[b][m-1] = 0;	// ! 인형을 뺏으므로 0으로 변경
}
break; // 그리고 브레이크.다시 새로운 const m 을 받아서 시작한다.

break는 한개의 for문만 닫는다. 그래서 "for (const m of moves)" 가 다시 시작된다.

 

"이렇게 진행하면 moves의 값들이 돌아감에 따라서 bucket[ ]에 값들이 쌓이게 된다. 하지만 이 게임에서는 가만히 쌓이기만 하면 안된다. 연속된 값이 똑같은 값이라면 제거해주고 result += 2; 해줘야 한다."

 

"어디서 그 작업을 해야하지?"

board[b][m -1] 값이 0 보다 클때 bucket으로 들어가기전에 이전에 있는 bucket의 마지막 index값과 비교를 진행하면 된다. 진행한뒤 값이 같다면 두값을 없애고(아직 bucket에 들어가지 않았으므로 bucket에 이미 있던 값만 pop() 해주면 된다.) result += 2; 하면 된다.

코드를 바꿔야 한다.

if (board[b][m-1] > 0) {
	if (bucket[bucket.length -1] === board[b][m - 1]) { bucket에 이전에 있었던 값과 같다면.
    	result += 2;
        bucket.pop();
    } else {
    	bucket.push(board[b][m -1]);
    }
    board[b][m -1] = 0;  //인형을 bucket에 넣었으므로 0
    break;
    }
}

 

 

 


추상화 과정

1- move loop 'm' ( moves)
2-   board loop 'b' (<board.length) 
3-     ( board[b][m] != 0) => { 
			bucket.push(bucket[b][m]);
			bucket[b][m] = 0; }

여기까지가 bucket에 인형을 넣는 과정.

bucket에 연속으로 같은 인형이 나오면 제거해주는 것을 넣어야한다. 어디다가 넣지?

"push" 하기전에 확인해주는게 좋겠다.

1- move loop 'm' ( moves)
2-   board loop 'b' (<board.length) 
3-     ( board[b][m] != 0) => { 	// ! 여기에 확인하는 과정 추가 !
			bucket.push(bucket[b][m]);
			bucket[b][m] = 0; }

여기까지가 bucket에 인형을 넣는 과정.

 

1- move loop 'm' ( moves)
2-   board loop 'b' (<board.length) 
3-     ( board[b][m] != 0) => { 
			if ( 이전 인형과 push하려는 버켓이 같은지 확인) {
              같으면 이전 인형을 지운다.
			bucket.push(bucket[b][m]);
			bucket[b][m] = 0; }

여기까지가 bucket에 인형을 넣는 과정.

'CS > 알고리즘' 카테고리의 다른 글

종이접기 [프로그래머스] 실패  (0) 2020.07.14
탑 _프로그래머스  (0) 2020.05.06
k번째수  (0) 2020.05.04
완전탐색 모의고사 수포자 / '%'를 쓸줄아느냐.  (0) 2020.05.04
완주하지 못한 선수.  (0) 2020.05.04