백준 5430 AC (kotlin)

Mendel·2024년 1월 2일

알고리즘

목록 보기
2/85

이 문제의 핵심은 다음과 같다. R과 D로 구성된 문자열이 주어지는데 이게 함수다. 그리고 정수배열이 주어졌을때, 이 정수배열에 함수를 따라 적절한 연산을 해주면 된다. 출력으로는 그 연산 결과를 출력해주면 된다.

R은 뒤집는거고, D는 현재 남은 배열에서 가장 앞 요소를 지우는 것이다.
즉, 결과물은 결국에는 중앙에 있는 정수들만 남게 된다.

그렇다면 실제로 배열을 매번 뒤집고 삭제해야할까? 아니다. 뒤집었다는 연산이 들어왔을때 배열을 읽는 순서를 반대로 생각하면 되고, 제거라는 연산이 들어오면 현재 읽는 방향에 따라서 그 방향의 첫 요소를 지우면 된다.

나는 실제로 지우지 않고, 뒤집지도 않기 위해 정수배열의 양끝을 가리키는 포인터를 두고, isLeftToRight라는 읽는 방향에 대한 정보가 담긴 변수를 선언했다.

뒤집으라는 연산이 오면, 읽는 방향의 변수의 상태만 뒤집으면 된다.
제거하라는 연산이 오면, 읽는 방향에 따라 그 쪽 방향의 첫 요소 다음을 포인터가 가리키도록 하면 된다.
에러가 나는 조건은 두 포인터가 중앙으로 가까워지다가 엇갈리게 되었는데 D라는 연산이 들어온 경우다.

코드는 다음과 같다.

import java.io.BufferedReader
import java.io.InputStreamReader

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    repeat(br.readLine().toInt()) {
        val functions = br.readLine()
        val n = br.readLine().toInt()
        val input = br.readLine()
        val subString = input.substring(1, input.length - 1) // [ ] 제거
        val numbers = if (n == 0) {
            emptyList()
        } else {
            subString.split(",").map { it.toInt() }
        }

        var left = 0
        var right = numbers.size - 1
        var isLeftToRight = true
        var isError = false
        for (i in 0 until functions.length) {
            if (functions[i] == 'R') {
                isLeftToRight = !isLeftToRight
            } else {
                if (left > right) {
                    isError = true
                    break
                }
                if (isLeftToRight) {
                    left++
                } else {
                    right--
                }
            }
        }

        if (isError) {
            println("error")
        } else {
            if (isLeftToRight) {
                println(numbers.subList(left, right + 1).joinToString(separator = ",", prefix = "[", postfix = "]"))
            } else {
                println(
                    numbers.subList(left, right + 1).reversed()
                        .joinToString(separator = ",", prefix = "[", postfix = "]")
                )
            }
        }
    }
}
profile
이것저것(안드로이드, 백엔드, AI, 인프라 등) 공부합니다

0개의 댓글