크레인 인형뽑기
https://programmers.co.kr/learn/courses/30/lessons/64061
package programmers.p64061;
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> MovedDolls = new ArrayList<>();
public int solution(int[][] board, int[] moves) {
moveDolls(board, moves);
return checkDuplicates();
}
private void moveDolls(int[][] board, int[] moves) {
for (int i = 0; i < moves.length; i++) {
for (int j = 0; j < board.length; j++) {
int lastIndex = board.length-(j+1);
if (board[moves[i] - 1][lastIndex] != 0) {
int caughtDoll = board[moves[i] - 1][lastIndex];
MovedDolls.add(caughtDoll);
board[moves[i] - 1][lastIndex] = 0;
break;
}
}
}
}
private int checkDuplicates() {
int count = 0;
for (int i = 0; i < MovedDolls.size(); i++ ) {
if (i+1 == MovedDolls.size()) {
break;
}
if (MovedDolls.get(i) == MovedDolls.get(i+1) ) {
count += 2;
i++;
}
}
return count;
}
}
어떻게 접근했나?
1. move에 따라 쌓여지는 인형들 적어봄
0은 공백
move 4 -> 2
move 1 -> 0
move 2 -> 3
move 1 -> 0
move 5 -> 3
move 3 -> 1
move 5 -> 1
move 1 -> 0
2. 0을 제외한 숫자를 보자
ArrayList에 0을 제외한 모든 숫자를 차례대로 담는다
같은 인형끼리 터진 인형을 세는 것이기 때문에
for문을 이용해서 같은숫자인지 비교해서 count 한다.
count되었으면 그 다음 비교를 위해서 i를 1 더해준다
문제 풀기 전..
move 4 -> 2
move 1 -> X
move 2 -> 3
move 1 -> X
move 5 -> 3
move 3 -> 1
move 5 -> 1
move 1 -> X
터뜨려서 사라진 인형의 갯수 -> return
첫번째 move한다.
move한 곳의 마지막인덱스의 값이 0인지 아닌지 체크한다
0이면 마지막인덱스-1이 마지막인덱스-1 이 0인지 아닌지 체크한다
마지막인덱스의 값이 0이 아니면 그 숫자를 임시 배열에 저장한다
moves가 다시 올걸 대비해서 저장한 숫자는 없는셈 치게 만들어야한다
그래야 다음에 왔을떄 없는셈 친 숫자 그 다음 숫자를 저장하니까.
boolean으로 앞뒤숫자가같은지 체크 만약에 ture이면
예) index[0], index[1], index[2] 이 모두 같은 값이다
일단 index[0]과 index[1]이 같은지체크한다
0과 1이 같으면 boolean true 같지않으면 false
true이면 int count +2 를 한다.
true이면 index[2]과 index[3]를 비교한다
false이면 index[1]과 index[2]를 비교한다
아니면,
그냥 moves로 집은 모든 숫자들을 담는다.
대신에 0이면 똑같은 배열에서 다시 집는다. 0이아니면 딱한번만 집는다.
집어서 새로운 배열에 넣는다 ArrayList가 좋을듯
중복값 0을 다 제거한다.
00002 0002 000000002 이배열을 체크할떄
2 2 2 이렇게 나올것이다.
그런다음에
boolean으로 앞뒤숫자가같은지 체크
예) ArrayList.get(0), ArrayList.get(1), ArrayList.get(2) 이 모두 같은 값이다
일단 0과 0이 같은지체크한다
0과 1이 같으면 boolean true 같지않으면 false
true이면 int count +2 를 한다.
true이면 index[2]과 index[3]를 비교한다
false이면 index[1]과 index[2]를 비교한다
처음에는 그냥 원래 있던 배열을 가지고 어떻게든 해보려했는데
그냥 팀원말대로 주워담은걸 0으로 바꾸면 되네....
느낀점
처음부터 끝까지 저렇게 상상할 필요가 없었던 거 같다.
코드짤때 모든게 다 바뀌기 때문이다.
정말 간략하게 어떻게 풀지 생각 하는 정도는 괜찮을 같다.
지나치게 생각을 많이한거 같다.
문제를 잘개쪼개서 절차대로 생각해서 쪼금씩 해결해나가다보면 답에 접근하게 되는것 같다.
한 개 주어진 테스트 케이스는 통과했는데 제출실패가 자꾸 떠서 열받는다. 저번에도 그랬는데 그때도 분명히 문제점이 있어서 그랬던거지만...특히 프로그래머스는 뭐가 문제인지 알려주지 않으니까 열받는다 ㅠ..
고려하지 못했던 거
혼자 해결을 못해서 팀원들에게 물어봤다
중간에 인형들이 터지면 위에서 인형이 내려오는건데
배열로 생각하니까 옆으로 쭉 나열되어있어서 그걸 생각치못했다.
Author And Source
이 문제에 관하여(크레인 인형뽑기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kyukim/algo저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)