728x90
문제
https://www.acmicpc.net/problem/14226
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
[ 입력 ]
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
[ 출력 ]
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
풀이
- BFS로 풀이
// 백준 - 이모티콘(14226)
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.StringTokenizer
import java.util.LinkedList
import java.util.Queue
data class Emoticon (
val time: Int,
val length: Int,
val clipboard: Int
)
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
var S = br.readLine().toInt()
var emoticon = LinkedList<Emoticon>() as Queue<Emoticon>
var visited = Array(S+1, {Array(S+1, {false})})
emoticon.offer(Emoticon(0, 1, 0))
visited[1][0] = true
while(!emoticon.isEmpty()) {
val emot = emoticon.poll()
if(emot.length == S) {
print(emot.time)
break
}
// 클립보드에 저장
emoticon.offer(Emoticon(emot.time + 1, emot.length, emot.length))
// 붙여넣기
// 클립보드에 저장된 게 있을 경우 + S보다 길지 않고 방문한적 없는 경우
val pasteLength = emot.length + emot.clipboard
if(emot.clipboard > 0 && pasteLength <= S && !visited[pasteLength][emot.clipboard]) {
emoticon.offer(Emoticon(emot.time + 1, pasteLength, emot.clipboard))
visited[pasteLength][emot.clipboard] = true
}
// 이모티콘 하나 삭제
// 삭제해도 이모티콘이 1개 이상 남고, 방문한적 없는 경우
val deleteLength = emot.length - 1
if(deleteLength >= 1 && !visited[deleteLength][emot.clipboard]) {
emoticon.offer(Emoticon(emot.time + 1, deleteLength, emot.clipboard))
visited[deleteLength][emot.clipboard] = true
}
}
}
728x90
'Programming > Kotlin' 카테고리의 다른 글
[백준/Kotlin] 비즈 공예(1301) (1) | 2024.06.26 |
---|---|
[LeetCode/Kotlin] 24. Swap Nodes in Pairs (0) | 2024.06.26 |
[LeetCode/Kotlin] 11. Container With Most Water (0) | 2024.06.24 |
[백준/Kotlin] 점수따먹기(1749) (0) | 2024.05.20 |
[백준/Kotlin] 경사로(14890) (0) | 2024.05.17 |