일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- intelliJ단축키
- 완전탐색
- 알고리즘
- 카카오코딩연습
- 프로그래머스
- 프로그래머스해쉬
- 알고리즘공부
- C++
- 백준
- 백준피보나치수
- 자바
- 백준하노이탑
- 프로그래머스JAVA
- 백준벌집
- 프로그래머스N으로표현
- 프로그래머스자바
- 프로그래머스전화번호목록
- 스프링부트와 AWS로혼자구현하는웹서비스
- 인텔리제이테스트클래스생성
- 백준팩토리얼
- 인텔리제이단축키
- java
- 코딩연습
- springboot
- 전화번호목록자바
- 백준피보나치
- 프로그래머스완주하지못한선수
- 백준팩토리얼자바
- dfs
- 테스트클래스생성단축키
- Today
- Total
말랑말랑
[프로그래머스] 크레인 인형뽑기 본문
[20-09-21]
중요 코드는 짜는데 얼마 걸리지도 않았는데,,,
문제를 이상하게 해석해서 수정하는 시간이 더 걸렸다
분명 잘 했는데 왜 안돼;;?하는 오류의 대부분은
너무나 당연하게 맞다고 생각한 부분이거나
리얼 별것 아닌 어이없는 부분이 잘못 되어있음..ㅋㅋㅋㅋ...
결론 : 뻘짓함
크레인 인형뽑기
문제
게임개발자인 죠르디는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다.
죠르디는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.
게임 화면은 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 배열의 가로 크기 이하인 자연수입니다.
입출력 예
board |
moves |
result |
[[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 |
입출력 예에 대한 설명
입출력 예 #1
인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.
풀이
import java.util.ArrayList;
import java.util.Stack;
class Solution {
public int solution(int[][] board, int[] moves) {
// 터뜨려서 사라진 인형수 세기 (moves에서 앞뒤로 겹쳐서 사라진 숫자 수)
int answer = 0;
// 귀찮으니까 스택을 관리하는 ArrayList 만듬
ArrayList<Stack<Integer>> stackList = new ArrayList<Stack<Integer>>();
int size = board.length;
// 0. 옮기기. 뭔가 맘에 안듬 나중에 바꾸자
for (int i = 0; i < size; i++) {
Stack<Integer> stack = new Stack<Integer>();
for (int j=size-1; j>=0; j--) {
if (board[j][i] != 0) {
stack.add(board[j][i]);
}
}
stackList.add(stack);
}
Stack<Integer> moveStack = new Stack<Integer>();
for(int i=0 ; i<moves.length ; i++) {
int moveIndex = moves[i]-1;
// 선택된 스택가져오기
Stack<Integer> selectStack = stackList.get(moveIndex);
// 옮길 위치(인덱스)에 블록이 있는지 확인
if( selectStack.size() > 0 ) { // 있으면
moveStack.push(selectStack.pop()); // 빼고 이동 스택에 넣기
if(moveStack.size() >= 2) {
int maxIndex = moveStack.size() - 1;
if(moveStack.get(maxIndex-1) == moveStack.get(maxIndex) ) {
moveStack.pop();
moveStack.pop();
answer += 2;
}
}
}
}
return answer;
}
}
문제에 대한 접근도 좋았고 풀이방식도 Stack으로 잘 접근했다...
그런데 배열을 옮겨 닮는 과정에서 바보같이 이미지만 보고 세로 열로 접근해서 넣는 바람에
예제 테스트 케이스를 제외하고는 다 fail을 먹음
너무 당황해서;;; 문제를 잘못이해했나 다시 읽어보니 역시나 잘못 이해한게 맞았다^_^...
빨리 하려고 의식의 흐름대로 하니 이런 실수가 생기는듯
그래도 금방 잡아내서 고쳤다 휴
정답ver
0 : [0,0,0,0,0],
1 : [0,0,1,0,3]
2 : [0,2,5,0,1]
3 : [4,2,4,4,2]
4 : [3,5,1,3,1]
원래는 위처럼 입력받는 배열을 위의 행부터 차례대로 값을 넣어서 처리해야 하는데
실수ver (세로로 넣음)
0 : [0,0,0,2,1],
1 : [0,0,1,4,3]
2 : [0,3,0,4,1]
3 : [0,0,5,2,5]
4 : [0,1,2,4,3]
첫번째 행으로 갔어야 할 것을 열로 들어가게 해서^^..... 심지어 반대로 쌓이도록 했음ㅋㅋㅋㅋㅋㅋㅋ...
정답 버전으로 하면 3분도 안걸렸을건데 괜히 꼬아서 이상하게 이해하는 바람에 휴...
이제는 해결해서 괜찮지만 예제 문제에서 부터 fail이 떴다면
더더더 빨리 찾을 수 있었을 텐데 아쉬움이 남음 흑
저렇게 했는데 어째서 예제문제는 통과를 했을까,,, 통과 됐던게 더 신기함
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
☆ 오늘의 결론 ☆
문제를 잘 읽자
잘 읽었다고 생각해도 한번 더 읽자
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 여행경로 (0) | 2021.06.04 |
---|---|
[프로그래머스] 두 개 뽑아서 더하기 (0) | 2021.04.07 |
[프로그래머스] 완주하지 못한 선수 (0) | 2021.04.06 |
[프로그래머스] 시저 암호 (0) | 2020.09.21 |
[프로그래머스] K번째 수 (0) | 2020.09.21 |