개발합니다
[005] 크레인 인형뽑기 게임 본문
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 |