ALGORITHM/Programmers + α

[프로그래머스] lv1. 크레인 인형뽑기 - JS / 자료구조(스택)

Harimad 2022. 3. 2. 16:55

문제

게임 개발자인 크레인 인형 뽑기 기계를 모바일 게임으로 만들려고 합니다. 조르디는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려 고 합니다.

게임 화면은 1 x 1 크기의 칸들로 이루어진 N x N 크기의 정사각 격자이며 위쪽에는 크레인 이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 5 x 5 크기의 예시입니다). 각 격자 칸에 는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 1 x 1 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인 형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다입니다

만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구 니에서 사라지게 됩니다. 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형 두 개가 없어집니다

크레인 작동 시 인형이 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동 시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. (그림에서는 화면 표시 제약으로 5칸만으로 표현하였음)

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위 치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

board 배열은 2차원 배열로 크기는 5 x 5 이상 30 x 30 이하입니다.

board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.

0은 빈칸을 나타냅니다.

1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나 타냅니다.

moves 배열의 크기는 1 이상 1,000 이하입니다.

moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다

 

▣입력예제 1

[[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]] //board 배열

[1,5,3,5,1,2,1,4] //moves 배열

 

▣출력예제 1

4

 

 

풀이

1. board에서 뽑은 값을 담을 stack 배열을 생성한다.

2. stack의 배열값중 같은값이 연속되는 개수를 확인할 answer 변수를 생성한다.

3. moves를 반복순회한다. moves배열의 값은 board 배열의 row값을 지칭하므로

   board[i][moves요소]값을 stack배열에 담아준다.

4. 그 값이 stack 배열에 값이 담긴 값과 같다면 stack값을 pop하고 answer를 2올려준다.

5. 반복순회한 후 answer 값을 리턴한다.

 

 

코드

function solution(board, moves) {
	let answer = 0;
	let stack = [];

	moves.forEach(idx => {
		let item = pickItem(board, idx-1);
		console.log(`item: ${item}`);
		if (item) {
			if (stack[stack.length-1] === item) {
				answer += 2;
				stack.pop();
			} else {
				stack.push(item);
			}
			console.log(`stack: ${stack}`);
		}
	})
	return answer;
}

function pickItem(board, idx) {
	let item;
	for (let i = 0; i < board.length; i++) {
		if (board[i][idx] !== 0) {
			item = board[i][idx];
			board[i][idx] = 0;
			return item;
		}
	}
}

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];
console.log(solution(board, moves));

 

 

출처

 

자바스크립트 알고리즘 문제풀이(코딩테스트 대비) - 인프런 | 강의

자바스크립트(JavaScript)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 재미있게 풀 수 있는 기초 단계 문제부터 고급 알고리즘까지 단계별로 차근차근 배우도록 설계된 강좌입니다., - 강의

www.inflearn.com