티스토리 뷰

PS

[Swift] 백준_AC(5430)

희철 2023. 1. 9. 12:58

문제

 

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 

 

 

풀이

 

reversed()의 시간복잡도가 O(1)이기 때문에 reversed()를 이용해서 구현해봤는데 시간초과가 나왔다. 

 

찾아보니 포인터로도 할 수 있을 것 같아 head와 tail 변수를 포인터로 생각하여 구현하였다.

어차피 뽑아내는 것은 앞에서만 뽑아내므로 reversed를 나타내는 변수를 두어 뒤집어진 상태에서는 tail을 하나 감소, 기본 상태에서는 head를 1 더해주었다.

 

이때 생각해야할건 tail보다 head가 큰 상태에서 D가 다시 나온다면 비어있는 상태에서 삭제하는 것이므로 error를 출력하도록 하였고, 명령어를 전부 수행한 뒤에도 head가 tail보다 크다면 원소 하나를 지웠거나 원래 []가 들어온 경우만 있으므로 그대로 []를 출력하도록 하였다.

import Foundation

let caseCount = Int(readLine()!)!
outer: for _ in 0..<caseCount {
    let command = readLine()!
    let _ = Int(readLine()!)!
    var numbers = readLine()!.dropFirst().dropLast().split(separator: ",")
    
    var isR = false
    var head = 0
    var tail = numbers.count - 1
    
    for char in command {
        if char == "R" {
            isR.toggle()
        } else {
            if tail < head {
                print("error")
                continue outer
            }
            if isR {
                tail -= 1
            } else {
                head += 1
            }
        }
    }
    if head > tail {
        print("[]")
    } else {
        if isR {
            numbers = numbers[head...tail].reversed()
        } else {
            numbers = Array(numbers[head...tail])
        }
        print("[\(numbers.joined(separator: ","))]")
    }
}

 

 

____________________________________________________________________________________________________

 

dropFirst()와 dropLast()로 하나씩 제거할 수 있는 것을 알게 되었다.

 

reversed를 이용하더라도 투포인터 같은 방법이 더 적게 걸릴 수도 있으므로 생각해야한다.

'PS' 카테고리의 다른 글

[Swift] 백준_뱀(3190)  (0) 2023.01.10
[Swift] 백준_좋은 친구(3078)  (0) 2023.01.10
[Swift] 백준_덱(10866)  (0) 2023.01.08
[Swift] 백준_Router(15828)  (0) 2023.01.08
[Swift] 백준_오아시스 재결합  (0) 2023.01.07
댓글
최근에 올라온 글
Total
Today
Yesterday