Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

개발합니다

[005] 크레인 인형뽑기 게임 본문

알고리즘

[005] 크레인 인형뽑기 게임

돈기법 2022. 4. 4. 00:54

https://programmers.co.kr/learn/courses/30/lessons/64061

코딩테스트 연습 - 크레인 인형뽑기 게임

[[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]] [1,5,3,5,1,2,1,4] 4

programmers.co.kr

[답]

import java.util.ArrayList;

public class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        
        ArrayList<Integer> basket = new ArrayList<Integer>();
        
        //1 -> board[0][0], [1][0], [2][0] ... 탐색
        //5 -> board[0][4], [1][4], [2][4] ... 탐색
        //for(i = 0; i < moves.length; i++) {
        //	if(board[i][moves[i]-1] != 0) {
        //		바구니 += board[i][moves-1];
        //		board[i][moves-1] = 0;
        //	}
        //}
        
        for (int i = 0; i < moves.length; i++) {
		for (int j = 0; j < board.length; j++) {
			if(board[j][moves[i]-1] != 0) {
				//바구니에 추가
				basket.add(board[j][moves[i]-1]);
				//보드에서 제거
				board[j][moves[i]-1] = 0;
				//바구니에 연속 두개 같은 숫자인지 체크
				if(basket.size() > 1) {
					if(basket.get(basket.size()-2) == basket.get(basket.size()-1)) {
						basket.remove(basket.size()-1);
						basket.remove(basket.size()-1);
						answer += 2;
					}
				}
				break;
			}
		}
	}
        
        System.out.println(basket);
        
        return answer;
    }
}

[풀이]

2차원 배열이 헷갈려서 주석으로 차근차근 시나리오를 돌려보며 이해했다.

[0,0] [1,0] [2,0] [3,0] [4,0]
[1,0] [1,1] [2,1] [3,1] [4,1]
[2,0] [2,1] [2,2] [3,2] [4,2]
[3,0] [3,1] [2,3] [3,3] [4,3]
[4,0] [4,1] [2,4] [3,4] [4,4]

board는 이러한 구조라고 보면 된다.

ArrayList로 객체를 생성해 값을 담고 비교하여 제거했다.
시나리오를 돌려본 결과, move=1일 때 board[n][0]을 탐색하기 때문에 move[i]-1 처리를 해줬다.

해당 위치에 인형이 있을 경우(!=0)
인형을 바구니에 저장-보드에서 제거-바구니에 들어있는 값 비교 순으로 구성하였다.

두 개의 값을 비교해야 하기 때문에 바구니의 size()가 2 이상일 경우 비교하도록 하였다.
같은 종류의 인형일 경우 둘 다 터져서 없어지기 때문에 remove()를 두 번 해줘야 한다.
터진 횟수를 카운트하는 게 아니라 터져서 없어진 인형을 세는 거기 때문에 answer도 2씩 증가시켜줘야 한다.

터진 횟수를 카운트하고선 이게 왜 틀렸냐며 한참을 헤맸다. 항상 문제를 잘 읽어보자...

이번에도 잘 동작되는지 확인하기 위해 print문으로 값을 찍어봤다.


다 풀고 다른 사람의 풀이를 보며 Stack으로 푸는 방식도 익혔다.
설명 그림 자체가 스택 구조여서 생각은 해봤지만 사용해본 적이 없어서 ArrayList로 진행했던 거였다.
접한 김에 공부

- Stack 선언

import java.util.Stack;

Stack<> stack = new Stack<>();


- Stack 값 추가

Stack<Integer> stack = new Stack<>();
stack.push(1);


- Stack 값 삭제

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);

stack.pop();	//맨 위에 값 제거 (3)

stack.clear(); 	//전체 값 제거 (초기화)


- Stack 가장 상단의 값 출력

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);

stack.peek();	//가장 상단의 값 출력 (2)


- Stack의 기타 메서드

stack.size();      // stack 사이즈 출력 : 2
stack.empty();     // stack이 비어있다면 true 있다면 false
stack.contains(1) // stack에 1이 있다면 true 없다면 false




- 참고 글
https://coding-factory.tistory.com/601

[Java] 자바 Stack 클래스 사용법 & 예제 총정리

Stack이란? 자료 구조 중 하나인 Stack의 사전적 정의는 '쌓다', '더미'입니다. 상자에 물건을 쌓아 올리듯이 데이터를 쌓는 자료 구조라고 할 수 있습니다. Stack의 가장 큰 특징은 나중에 들어간 것

coding-factory.tistory.com

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

[004] 숫자 문자열과 영단어  (0) 2022.04.04
[003] 전화번호 목록  (0) 2022.04.03
[002] 완주하지 못한 선수  (0) 2022.04.03
[001] 피보나치 수열 출력  (0) 2022.04.03