문제
접근
인형을 집는 부분, 쌓인 인형을 체크하는 부분으로 나누어서 생각했다.
집는 부분은 해당 열의 데이터를 순서대로 확인하며 비어있지 않은 칸을 만나면 인형을 꺼낸다.
체크하는 부분은 쌓인 인형의 가장 꼭대기와 현재 집은 인형이 같은지만 확인하면 된다.
코드
- 파이썬 코드
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
def solution(board, moves):
answer = 0
box = []
for move in moves:
for i in range(len(board)):
if board[i][move-1] != 0:
isSame = boxCheck(box, board[i][move-1])
if isSame:
box.pop()
answer += 2
else:
box.append(board[i][move-1])
board[i][move-1] = 0
break
return answer
def boxCheck(box, item):
isSame = False
if len(box) == 0:
isSame = False
else:
if box[-1] == item:
isSame = True
return isSame
- C++ 코드
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
29
30
31
32
bool boxCheck(vector<int> box, int item){
bool isSame = false;
if(box.empty())
return isSame;
if(box.back() == item)
isSame = true;
return isSame;
}
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
vector<int> box;
for(int i = 0; i < moves.size(); i++){
int move = moves[i] - 1;
for(int j = 0; j < board[0].size(); j++){
if(board[j][move] != 0){
bool isSame = boxCheck(box, board[j][move]);
if(isSame){
box.pop_back();
answer+=2;
}
else{
box.push_back(board[j][move]);
}
board[j][move] = 0;
break;
}
}
}
return answer;
}