boraBong

[Swift] 5430번: AC 문제 풀이 [BOJ - Gold5] 본문

iOS/Algorithm

[Swift] 5430번: AC 문제 풀이 [BOJ - Gold5]

보라봉_ 2023. 4. 21. 04:20
728x90

💬 문제

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

 

5430번: AC

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

www.acmicpc.net

 


💬 Idea

  • 함수 수행시 R이 나올 때마다 reverse를 수행하고, D가 나올 때마다 removeFirst()를 수행해주었더니 시간 초과가 발생했다.
  • 따라서 투포인터 방식을 활용해서 풀이해주었다.
    • R을 수행할 차례라면 isReverse flag를 변경해준다
    • D를 수행할 차례라면
      1. pointer가 reversepointer보다 크다면 → error인 경우이므로 error를 출력하고 continue문을 수행시킨다. (-> labeled로 인해 중첩 for문 같이 영향)
      2. isReversed flag 상태라면 → reversepointer를 좁혀준다.
      3. isReversed flag 상태가 아니라면 → pointer 범위를 늘려준다.
    • RD 함수 종료 후
      • pointer가 reversepointer보다 크다면 빈 배열을 의미하므로 []를 출력한다.
      • 그렇지 않다면 pointer부터 reversepointer까지 배열을 slice한 후 출력 조건에 맞게 배열을 맵핑한 뒤 출력한다.
        • (배열 자체를 출력할 경우 [1,2,3] 과 같이 출력되지 않고 [1, 2, 3] 과 같이 출력되므로 답이 틀리다고 나오므로 주의하자.)

 


💬 풀이

import Foundation

func solution5430() {
    let t = Int(readLine()!)!
    
outloop: for _ in 0..<t {
        let function = readLine()!
        let n = Int(readLine()!)!
        let arr = readLine()!.trimmingCharacters(in: ["[", "]"]).split(separator: ",").map({ Int(String($0))! })
        var pointer = 0
        var reversepointer = n - 1
        var isReverse = false
    
        for i in function {
            if i == "R" {
                isReverse = !isReverse
            } else {
                if pointer > reversepointer {
                    print("error")
                    continue outloop
                }
                
                if isReverse {
                    reversepointer -= 1
                } else {
                    pointer += 1
                }
            }
        }
        
        if pointer > reversepointer {
            print("[]")
        } else {
            var ans = arr[pointer...reversepointer]
            if isReverse {
                ans.reverse()
            }
            print("[" + ans.map({ String($0) }).joined(separator: ",") + "]")
        }
    }
}

 


💬 알게된 문법

  • for문에 레이블을 붙여 사용하면 중첩 for문도 한꺼번에 탈출이 가능하다.

 

 

 

https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/5430_AC.swift

 

GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift

Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.

github.com

 

반응형
Comments