https://programmers.co.kr/learn/courses/30/lessons/64061
여러가지 방법이 존재한다고 생각한다
처음에 생각했던 것은 board로 받아내는 것을 stack 리스트로 변경해서 표현하는 방식을 생각도 해봤는데 크기가 최대 30 * 30이라서 이 방법은 바로 접었다.
두번째로 무난하게 떠올랐던 것은 board의 size를 반복하는 i와 moves를 표현하는 j를 사용하여 board[i][j-1]의 값이 0이 아니면 stack에 담는 방법으로 문제를 해결했다.
이때 담는 과정 중에 stack.peek의 값이 같다면 넣지말고 pop하는 식으로 해 While문을 줄여서 사용했다
// 처음에 생각한 거
fun solution2(board: Array<IntArray>, moves: IntArray): Int {
var answer = 0
val stack = Stack<Int>()
for(i in 0 until moves.size){
loop@for(j in 0 until board.size) {
if(board[j][moves[i]-1] != 0){
stack.add(board[j][moves[i]-1])
board[j][moves[i]-1] = 0
break@loop
}
}
}
while(!stack.isEmpty()){
val pop = stack.pop()
if(!stack.isEmpty()){
if(pop == stack.peek()){
answer += 2
stack.pop()
}
} else {
break
}
}
return answer
}
// stack 연산을 굳이 빼서 하지 않고, board 반복문 내에서 처리
fun solution(board : Array<IntArray>, moves: IntArray) : Int {
var answer = 0
val stack = Stack<Int>()
moves.forEach {
for(i in 0 until board.size){
if(board[i][it -1] != 0){
if(stack.isNotEmpty() && stack.peek() == board[i][it-1]){
answer += 2
stack.pop()
} else {
stack.push(board[i][it-1])
}
board[i][it-1] = 0
break
}
}
}
return answer
}