본문 바로가기

알고리즘(w.KOTLIN)/그래프(bfs, dfs, 다익스트라)

[백준][코틀린][14226] 이모티콘

728x90

https://www.acmicpc.net/problem/14226

 

14226번: 이모티콘

영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만

www.acmicpc.net

문제 풀이

1. 주어진 조건에 따라 BFS 로 탐색한다.

2. 이전 탐색을 방문했는 지 확인하는 visit 배열을 2차원으로 선언하고 현재 화면의 이모티콘과 클립보드에 있는 이모티콘을 index 하여 방문 여부를 업데이트 하고 확인한다. (visit[currentEmo][clipEmo])

3. clipEmo 와 curEmo 값이 0보다 작거나 1000을 넘어갈 경우 조건 밖의 경우이므로 제외 한다.

코드

import java.io.*
import java.util.*

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val S = br.readLine().toInt()

    bfs(1, S)
}

private fun bfs(start: Int, target: Int) {
    val queue = LinkedList<Triple<Int, Int, Int>>() // (현재 이모티콘, 클립보트 이모티콘, 소요 시간)
    queue.add(Triple(start, 0, 0))
    val visit = Array(1001) { BooleanArray(1001) { false } }

    while (queue.isNotEmpty()) {
        val (curEmo, clipEmo, time) = queue.pop()

        if (curEmo == target) {
            println(time)
            break
        }

        if ((clipEmo > 1000 || clipEmo < 0) || (curEmo > 1000 || curEmo < 0)) continue

        if (visit[curEmo][clipEmo]) continue

        visit[curEmo][clipEmo] = true

        //println("current : $curEmo, $clipEmo, $time")

        queue.add(Triple(curEmo, curEmo, time + 1))
        queue.add(Triple(curEmo + clipEmo, clipEmo, time + 1))
        queue.add(Triple(curEmo - 1, clipEmo, time + 1))
    }
}
728x90