728x90
https://www.acmicpc.net/problem/2138
2138번: 전구와 스위치
N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 < i < N)번 스위치를 누르면 i-1, i, i+1의 세 개의 전구의 상태가 바뀐다. 즉, 꺼져
www.acmicpc.net
문제 풀이
1. 현재 전구 상태(currentLamp)와 만들고자 하는 상태(targetLamp) 를 선언한다.
2. lamp1Count, lamp2Count 를 선언하고 각각 스위치를 켠 횟수를 저장한다.
3. lamp1, lamp2 배열을 선언하고 lamp1에는 0번째 전구를 켜지 않은 배열을 저장하고 lamp2에는 0번째 전구를 배열을 저장한다. lamp2Count 를 1 증가 시킨다.
4. 1부터 N-1 까지 탐색을 아래와 같은 조건에 대해서 탐색한다.
5. 현재 index 를 기준으로 index - 1 이 만들고자 하는 상태의 index - 1 과 다를 경우에는 현재 index 의 스위치를 켠다.
6. 5번 과정을 모두 탐색한후 lamp1 와 targetLamp 및 lamp2 와 targetLamp 가 같은 지 확인한다.
코드
import java.io.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val currentLamp = br.readLine()
val targetLamp = br.readLine()
if (currentLamp == targetLamp) {
println(0)
} else {
// 첫번째 램프를 켜지 않을때 정보 저장
val lamp1 = IntArray(N) { 0 }
var lamp1Count = 0
// 첫번째 램프를 켰을 때 정보 저장
val lamp2 = IntArray(N) { 0 }
var lamp2Count = 0
for (i in 0 until N) {
lamp1[i] = currentLamp[i].digitToInt()
lamp2[i] = currentLamp[i].digitToInt()
}
// 첫번째 램프를 켠다.
switchOn(lamp2, 0, N)
lamp2Count = 1
for (i in 1 until N) {
if (lamp1[i - 1] != targetLamp[i - 1].digitToInt()) {
switchOn(lamp1, i, N)
lamp1Count++
}
if (lamp2[i - 1] != targetLamp[i - 1].digitToInt()) {
switchOn(lamp2, i, N)
lamp2Count++
}
}
for (i in 0 until N) {
if (lamp1[i] != targetLamp[i].digitToInt()) {
lamp1Count = Int.MAX_VALUE
break
}
}
for (i in 0 until N) {
if (lamp2[i] != targetLamp[i].digitToInt()) {
lamp2Count = Int.MAX_VALUE
break
}
}
if (lamp1Count == Int.MAX_VALUE && lamp2Count == Int.MAX_VALUE) println(-1)
else {
println("${Math.min(lamp1Count, lamp2Count)}")
}
}
}
private fun switchOn(arr: IntArray, index: Int, n: Int) {
if (index != 0) arr[index - 1] = if (arr[index - 1] == 1) 0 else 1
arr[index] = if (arr[index] == 1) 0 else 1
if (index != n - 1) arr[index + 1] = if (arr[index + 1] == 1) 0 else 1
}
728x90
'알고리즘(w.KOTLIN) > 그리디(Greedy)' 카테고리의 다른 글
[백준][코틀린][1202] 보석 도둑 (0) | 2023.05.08 |
---|---|
[백준][코틀린][1285] 동전 뒤집기 (0) | 2023.05.08 |
[백준][코틀린][1080] 행렬 (0) | 2023.04.24 |
[백준][코틀린][11399] ATM (0) | 2023.04.22 |
[백준][코틀린][1931] 회의실 배정 (0) | 2023.04.21 |