문제 설명

게임 개발자 “Jordi”는 크레인 발톱 기계를 모바일 게임으로 바꾸려고 합니다.
“조르디”는 게임의 재미를 높이기 위해 다음과 같이 화면 구성과 규칙을 게임 로직에 매핑하려고 합니다.
게임 화면 “1×1” 사각형으로 구성 “NxN” 상단에 크레인이 있고 오른쪽에 바구니가 있는 정사각형 그리드. (위 이미지는 “5 x 5” 크기의 예시입니다.) 각 그리드 셀에는 수많은 번데기가 포함되어 있으며 번데기가 없는 셀은 비어 있습니다. 각 인형은 “1 x 1” 그리드의 슬롯을 차지합니다. 그리드의 맨 아래 셀부터 시작하여 서로 위에 쌓입니다. 게임 이용자는 크레인을 좌우로 움직여 정지된 위치에서 맨 위의 인형을 집을 수 있습니다. 픽업된 인형은 바구니에 쌓이게 되는데, 이때 인형은 바구니의 바닥부터 차례대로 쌓이게 된다. 아래 이미지에서 모든 인형을 순서대로(#1, #5, #3) 집어 바구니에 담습니다.
젖어 있다.
같은 모양의 인형 2개를 바구니에 일렬로 쌓으면 두 인형 모두 폭발하여 바구니에서 사라집니다. 위의 조건에서 위치(#5)에서 인형을 집어 바구니에 쌓으면 인형은 같은 모양이 됩니다. 둘사라집니다.

크레인 작동시 인형이 안올라가는 경우는 없지만 인형이 없는곳에서 크레인을 작동시키면 아무일도 일어나지 않습니다. 바구니는 또한 모든 인형을 담을 수 있을 만큼 충분히 크다고 믿어집니다. (화면 표시 제한으로 그림에서는 5칸만 표현하였습니다.)
게임 화면의 그리드 상태를 담은 2차원 필드와 꼭두각시 인형을 집기 위해 크레인을 조작한 위치를 담은 이동 필드를 파라미터로 주면 solve 함수는 결국 폭발해 다시 사라진 인형의 수를 반환한다. 크레인이 제공되었습니다. 작성해주세요
(제한)
– 보드 배열은 2차원 배열이며 크기는 “5 x 5” 이상 “30 x 30” 이하입니다.
– 보드의 각 셀에는 0에서 100 사이의 정수가 포함됩니다.
– 0은 빈 필드를 나타냅니다.
– 1부터 100까지의 숫자는 각각 다른 인형 모양을 의미하며 같은 숫자는 같은 모양의 인형을 의미합니다.
– 이동 배열의 크기는 1에서 1,000 사이여야 합니다.
– 이동 배열의 각 요소 값은 1보다 크거나 같고 보드 배열의 가로 크기보다 작거나 같은 자연수입니다.
I/O 예시
| 널빤지 | 감정적인 | 결과 |
| ((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 |
I/O 예시 설명
I/O 예제 #1
퍼펫의 초기 상태는 작업의 예와 동일합니다. 크레인이 위치(1, 5, 3, 5, 1, 2, 1, 4)에서 순서대로 인형을 집어 바구니에 옮기면 아래 그림과 같이 상태가 4가 됩니다.
풀다
import java.util.LinkedList;
class Solution {
public int solution(int()() board, int() moves) {
int result = 0;
LinkedList<Integer> list = new LinkedList<Integer>();
for(int i=0;i<moves.length;i++) {
for(int j=0;j<board(0).length;j++) {
if(board(j)(moves(i)-1) == 0) {
continue;
}else {
list.add(board(j)(moves(i)-1));
board(j)(moves(i)-1) = 0;
break;
}
}
}
int pos = 0;
while(pos<list.size()-1) {
if(list.get(pos) == list.get(pos+1)) {
list.remove(pos+1);
list.remove(pos);
result += 2;
pos = pos-1<0?0:pos-1;
}else {
pos++;
}
}
return result;
}
}
ArrayList와 마찬가지로 삽입하거나 삭제할 때 나머지 데이터를 이동하거나 드래그하지 않고 주소만 연결하는 속성이 있습니다. LinkedList필요한
먼저 크레인은 각 열의 상단에 있는 board(0).length부터 0이 아닌 값을 만날 때까지 반복하고, 0이 아닌 값을 만나면 선언한 LinkedList 타입 목록에 추가하고 해당 위치에 0으로 초기화됩니다.
list.get(0) : 4
list.get(1) : 3
list.get(2) : 1
list.get(3) : 1
list.get(4) : 3
list.get(5) : 2
list.get(6) : 4
위의 for 문이 모두 실행되면 작업에 제공된 예제를 기반으로 다음과 같이 목록이 초기화됩니다.
while 문에서 비교할 위치를 기억하고 있는 pos 변수를 사용하여 pos 인덱스와 pos+1 인덱스가 같으면 결과에 2가 누적되어 둘의 위치는 리스트에서 제거된다. 이 시점에서 이것은 연결 목록이므로 삭제된 데이터의 위치를 별도로 처리할 필요가 없습니다. 4311324 11이 없어졌으니 43324가 아니다 43324pos의 위치를 줄이고 while 문을 다시 반복합니다. 43324 지우기 33 424더 이상의 중복번호가 없을 때까지 진행됩니다.
제일 먼저 떠오른 방법이 LinkedList 였는데 리스트를 많이 써서 익숙해서 그렇게 해결했는데 스택을 이용한 솔루션이 많았습니다.
-원천
https://school.programmers.co.kr/learn/courses/30/lessons/64061