본문 바로가기
알고리즘문제풀이

[JAVA] Programmers LEVEL1 크레인 인형뽑기

by Hindsight.. 2020. 9. 11.

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.Stack;

class solution {

	public int solution(int[][] board, int[] moves) {
		int picked, idx, answer = 0;
		Stack<Integer> s = new Stack<Integer>();
		int[] tmp;

		for (int cmd : moves) {
			cmd--;
			tmp = rtoc(board, cmd); // 커맨드에 해당하는 열을 추출
			idx = getDoll(tmp); // 인덱스 추출
			
			if (idx == -1) // -1이면 다음 커맨
				continue;
			
			picked = board[idx][cmd]; // 해당 열의 숫자를 저장
			board[idx][cmd] = 0; // 해당 열은 0으로 바꿔준다.
			
			if (!s.isEmpty() && s.peek() == picked) { // 스택이 비지 않고, 가장 위의 수와 위에서 집은 수와 비교
				answer += 2;
				s.pop(); // 같다면 answer을 2 추가해주고, 가장 위의 수 pop 후 다음 커맨드
				continue;
			}
			s.add(picked); // 위의 경우에 해당하지 않는다면, picked를 스택에 넣고 다음 커맨드
		}
		return answer;
	}

	int[] rtoc(int[][] board, int num) { // 가로세로변경
		int[] arr = new int[board.length];
		for (int j = 0; j < board.length; j++) {
			arr[j] = board[j][num];
		}

		return arr;
	}

	int getDoll(int[] arr) { // 배열 중 가장 첫번째로 0 이 아닌 인덱스 리턴, 모두 0일 경우 -1 리턴
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] != 0) {
				return i;
			}
		}
		return -1;
	}

}

 

문제를 보면 스택을 노골적으로 요구하고 있는 것처럼 보이는데, 내 코드보다 짧고 효율적으로 쓴 사람들도 훨씬 많았다..

하지만 그 코드들을 직관적으로 이해하기 힘들 분들을 위해 조금이라도 도움이 될 수 있을까 해서 업로드 한다!