코딩테스트/programmers level1

[kotlin] 프로그래머스 level1 - 크레인 인형뽑기 게임

뚜벅이! 2020. 11. 11. 11:25
728x90

 

 

우선적으로 크레인이 어느지점까지 내려가야 하는지 알아볼 필요가 있었다.

 

board는 2차배열이기 때문에 세로의 길이는 board의 length로 확인할수 있고, 가로는 moves에 있기때문에

board.length 만큼 반복문을 돌려서 크레인이 제일 하단까지 확인할 수 있게끔 할수 있다.

 

또한 moves는 몇번째의 가로 인덱스인지 알려주는 역할도 있지만, 더불어 크레인이 몇번 작동하는지도 알수 있다.

그렇기에 크레인이 작동하는 횟수만큼의 반복문과 크레인이 최하단까지 갈 수 있는 반복문 총 2개가 필요하다

 

 

 

우선, 크레인의 반복 횟수와 내려가는 만큼의 반복문을 만든다면


//크레인의 작동 횟수
moves.forEach { move ->
    //board의 길이
    board.forEachIndexed{ index, _ ->
    }
}

이런식의 틀이 맞추어질 것이고,

여기서 조건문으로 크레인이 내려가는도중 board의 값이 0이 아닐경우 바구니에 넣어두는 코드가 필요할 것이다.

더하여 바구니에 넣었다면 해당 board는 인형이 비어있게 되니 0으로 세팅해준다.

 


var tmp: ArrayList = arrayListOf()
//크레인의 작동 횟수
moves.forEach { move ->
    //board의 길이
    board.forEachIndexed{ index, _ ->
        val value = board[index][move-1]
        //board가 비어있는 값이 아니라면
    	if(value != 0){
            tmp.add(value)
            board[index][move-1] = 0
        }
    }
}

var tmp: ArrayList<Int> = arrayListOf()

문제속 바구니값의 변수를 만들어주고,

0이 아닐때 넣어주는 코드가 완성된다.

 

 

 

이제 바구니에 있는 인형이 이전에 뽑았던 인형과 같은 인형이라면 사라져야 하므로 이전값과 비교해주는 구문을 넣어주도록 하자


var tmp: ArrayList = arrayListOf()
//크레인의 작동 횟수
moves.forEach move@{ move ->
    //board의 길이
    board.forEachIndexed{ index, _ ->
        val value = board[index][move-1]
        //board가 비어있는 값이 아니라면
    	if(value != 0){
            //tmp의 lastIndex를 가져올때 빈값이라면 에러나므로 분기문에 추가해준다.
            if(tmp.size > 0 && tmp.get(tmp.lastIndex) == value){
            	tmp.removeAt(tmp.lastIndex)
                answer++
            }else{
                //바구니에 같은 인형이 없는경우 추가해주기
            	tmp.add(value)
            }
            board[index][move-1] = 0
            return@move
        }
    }
}

이렇게 바구니의 값과 비교하는 조건문을 넣어주고, 이중반복문이기때문에 크레인이 인형이있는곳에서 멈추게하기 위하여

반복문에 인덱스 @move 를 걸어주고 진행한다.

 

 

인형이 사라진다면 두개가 사라지므로 answer 에 *2 를 해주어 갯수를 맞춰주면 끝!

728x90