본문 바로가기

알고리즘

[Kotlin] 소금쟁이

문제

N*N 의 정사각형 연못이 있다고 가정할 때, 소금쟁이가 연못의 물위를 뛰어 다닌다. 소금쟁이가 처음에 뛸때는 3 칸, 두번째 뛸때는 2 칸, 세번째 뛸때는 1 칸 뛰게 된다. 여러마리의 소금쟁이가 시작위치와 방향을 달리하여 뛰었을 때 연못의 밖으로 나가거나, 앞에서 뛰었던 소금쟁이가 세번째 뛰고 머무른 위치와 충돌하면 죽는다. 연못내에 살아있는 소금쟁이 수를 출력하세요.

 

  • N 은 자연수 5~20 의 값이다.
  • 소금쟁이의 처음 위치와 방향이 주어진다.
  • 여러 마리의 소금쟁이가 순서대로 3 번씩 뛴다. 뛸 때 마다 3 칸, 2 칸 1 칸씩 뛴다. 
  • 3번 뛴 소금쟁이는 그 자리에 머문다.
  • 뛰는 도중 연못 밖으로 나가거나 다른 소금쟁이가 머물러 있는 곳으로 뛰면 죽는다.
  • 시작위치에 이미 다른 소금쟁이가 있다면 죽는다.

풀이

  • 소금쟁이의 위치와 방향을 배열에 저장한 뒤, 배열에 순서대로 접근하며 로직을 수행한다.
  • isIn : 연못 내에 위치하는지 확인
  • already : 이미 그 자리에 소금쟁이가 있는지 확인
  • 코틀린 입출력에 대해 배우지 않아 입력값은 하드코딩을 하였다.

코드

package com.ssafy.memo
class Solution{}
fun main(){

    val dx = arrayOf(-1,1,0,0)
    val dy = arrayOf(0,0,-1,1)
    var answer=0
//    var map = arrayOf(
//        arrayOf(0,0,0,0,0,0,0,0,0),
//        arrayOf(0,0,0,0,0,0,0,0,0),
//        arrayOf(0,0,0,0,0,0,0,0,0),
//        arrayOf(0,0,0,0,0,0,0,0,0),
//        arrayOf(0,0,0,0,0,0,0,0,0),
//        arrayOf(0,0,0,0,0,0,0,0,0),
//        arrayOf(0,0,0,0,0,0,0,0,0),
//        arrayOf(0,0,0,0,0,0,0,0,0),
//        arrayOf(0,0,0,0,0,0,0,0,0))
    var map = arrayOf(
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0),
        arrayOf(0,0,0,0,0,0,0,0,0))

//    val input = arrayOf(
//        arrayOf(6,2,4),
//        arrayOf(1,5,2),
//        arrayOf(0,0,4),
//        arrayOf(6,6,1),
//        arrayOf(2,4,3)
//    )

    val input = arrayOf(
        arrayOf(0,0,4),
        arrayOf(6,0,1),
        arrayOf(2,4,3),
        arrayOf(4,2,4),
        arrayOf(1,5,2),
        arrayOf(10,8,1)
    )
    //그 위치에 소금쟁이가 있는지 확인, 0이면 있음 1이면 없음
    val already = {x:Int, y: Int->
        if(map[x][y]!=0) 0
        else 1
    }

    //연못 안인지 확인, 0이면 연못안, 1이면 연못밖
    val isIn = {x: Int, y: Int->
        if(x in 0..8 && y in 0..8) 0
        else 1
    }

    //소금쟁이 이동
    fun start(i: Int, j:Int, dir: Int){
        var x = i
        var y = j
        //3,2,1 칸 순으로 뛰기 때문
        for(i in 3 downTo 1) {
            val nx = x + dx[dir - 1] * i
            val ny = y + dy[dir - 1] * i
            //이전 위치 0
            map[x][y] = 0
            if (isIn(nx, ny) == 1 || already(nx, ny) == 0) {return}
            map[nx][ny] = dir
            x = nx
            y = ny
        }
        answer++
    }


    //map에 소금쟁이 위치 입력
    for(i in 0 until input.size){
        val x = input[i][0]
        val y = input[i][1]
        map[x][y]=input[i][2]
    }

    for(i in 0 until input.size){
        start(input[i][0],input[i][1], input[i][2])
    }

    println(answer)

}

느낀점

그래프 상,하,좌,우 탐색에 대해 확실히 감을 잡은 것 같다. 옛날보다 방향 관련 처리를 하는 것이 어렵지 않게 느껴졌다. 가끔 이렇게 성장함을 느끼는 것이 공부의 즐거움이자 원동력인 것 같다.....

'알고리즘' 카테고리의 다른 글

BOJ 13460 구슬탈출2 (JAVA)  (2) 2022.04.28
[BOJ] BOJ 14500. 테트로미노 (JAVA)  (0) 2022.04.06
[BOJ] 1254. 팰린드롬 만들기 (JAVA)  (0) 2022.03.31
[BOJ] BOJ 15486. 퇴사2 (JAVA)  (0) 2022.03.07
[BOJ] BOJ 14891. 톱니바퀴 (JAVA)  (0) 2022.03.04