본문 바로가기

알고리즘(w.KOTLIN)/그리디(Greedy)

[백준][코틀린][2138] 전구와 스위치

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