31844번: 창고지기백준/문제2024. 9. 2. 17:21
Table of Contents
문제 출처 : https://www.acmicpc.net/problem/31844
언어 : Kotlin
문제 설명 :
인하대학교의 자료구조 · 알고리즘 연구 소모임 CTP는 스터디에 필요한 비품들을 비좁은 창고에 보관하고 있다. 창고는 아래의 그림과 같이 일렬로 나열된 1x1 크기의 칸 10개로 이루어져 있다. 각 칸에는 로봇 또는 박스가 하나 있을 수 있으며, 창고에는 로봇과 박스가 정확히 하나씩 있다.
CTP의 창고지기 시은이는 로봇에게 명령을 내려 박스를 원하는 칸으로 옮기려고 한다. 로봇에게 내릴 수 있는 명령은 다음 두 종류이다.
- 인접한 빈칸으로 이동한다.
- 인접한 칸의 박스를 밀고 박스가 있던 칸으로 이동한다. 박스는 밀려날 때 로봇이 없는 인접한 칸으로 이동한다. 이 명령은 박스가 밀려날 수 있는 칸이 없다면 실패한다.
위 그림의 경우 두 번의 명령으로 박스를 원하는 칸(깃발로 표시)으로 이동시킬 수 있다. 창고의 상태가 주어지면 적어도 몇 번의 명령을 해야 박스를 원하는 칸에 둘 수 있을지 알아보자.
입력 :
첫 번째 줄에 창고의 상태를 나타내는 10개의 문자가 주어진다.
각 문자는 ‘.’, ‘@’, ‘#’, ‘!’ 중 하나로, 각각 빈칸, 로봇이 있는 칸, 박스가 있는 칸, 박스를 놓아야 하는 칸을 뜻한다.
‘@’, ‘#’, ‘!’는 정확히 하나씩 주어진다. 즉, 박스가 처음부터 목표 지점에 있는 경우는 주어지지 않는다.
출력 :
적어도 몇 번의 명령을 해야 박스를 원하는 칸에 둘 수 있는지 출력한다.
몇 번의 명령을 내려도 박스를 원하는 칸으로 옮길 수 없다면 대신 ‘-1’을 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 1024MB
입출력 예 :
입력 | 출력 |
.@.#!..... | 2 |
..!..#..@. | 5 |
#....@.!.. | -1 |
풀이 :
import java.io.BufferedWriter
import java.io.OutputStreamWriter
import kotlin.math.abs
fun main() = with(System.`in`.bufferedReader()) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
var cnt = -1
readLine().let { str ->
str.replace(".", "").let {
if (it == "@#!" || it == "!#@") {
val robotIdx = str.indexOf("@")
val destination = str.indexOf("!")
cnt += abs(robotIdx - destination)
}
}
}
bw.write("$cnt")
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
31833번: 온데간데없을뿐더러 (0) | 2024.09.03 |
---|---|
31907번: GIST (2) | 2024.09.02 |
18269번: Where Am I? (0) | 2024.08.30 |
15464번: The Bovine Shuffle (0) | 2024.08.30 |
1148번: 단어 만들기 (0) | 2024.08.29 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!