[프로그래머스]크레인 인형뽑기 게임(2019 카카오 개발자 인턴십)

송훈기·2022년 1월 16일
0

Algorithm

목록 보기
7/7

문제

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
    }
profile
안녕하세요 송훈기입니다.

0개의 댓글