본문 바로가기
Problem Solving/BOJ

백준 5430번 AC - 스위프트(Swift) 풀이 + 그림 설명

by 어멘드 2022. 1. 18.
반응형
1. 맨 앞을 가리키는 front, 맨 뒤를 가리키는 end, 역방향 여부를 저장하는 변수 reverse를 둔다.
2. R이 들어오면, swap(front, end)와 reverse.toggle()로 배열을 뒤집는 연산을 구현한다.
3. D가 들어오면 정방향이면 front++ 역방향이면 front--로 맨 앞 삭제를 구현한다.
4. front와 end의 대소 비교 + reverse 여부를 가지고 빈 배열인지 판단한다.

1. 맨 앞을 가리키는 front, 맨 뒤를 가리키는 end, 역방향 여부를 저장하는 변수 reverse를 둔다.

 진짜로 배열을 뒤집으면 시간 초과가 날 것이다. 진짜로 배열을 뒤집지 말고, 생각만 뒤집는다. 왼쪽부터 읽던 것을 오른쪽부터 읽는 것처럼 말이다. 이것을 위해 front, end, reverse 변수를 둔다.

 

2. R이 들어오면, swap(front, end)와reverse.toggle()로 배열을 뒤집는 연산을 구현한다.

 생각을 뒤집어주기로 했으므로, reverse라는 Bool값을 반대로 뒤집어준다(toggle). swap은 사실 안 해도 reverse 보고 뒤집어서 생각하면 되는데, 헷갈리니까 그냥 swap까지 해주었다.

 

3. D가 들어오면 정방향이면 front++ 역방향이면 front--로 맨 앞 삭제를 구현한다.

 맨 앞 원소를 삭제하는 연산은 front 인덱스를 한 칸 옮겨주면 된다. 정방향(reverse = false) 일 때는 start를 한 칸 오른쪽으로 옮기고, 역방향(reverse = true) 일 땐 start를 한 칸 왼쪽으로 옮긴다.

 

4. front와 end의 대소 비교 + reverse 여부를 가지고 빈 배열인지 판단한다.

 정방향(reverse = false) 일 때는 start > end이면 빈 배열이고, 반대로 역방향(reverse = true) 일 때는 start < end이면 빈 배열이다. 에러 검사는 이렇게 front와 end의 대소 비교 + reverse 여부를 모두 고려해서 해준다.

 


import Foundation


var result = ""

var T = Int(readLine()!)!

while T > 0 {
    let p = readLine()!
    let n = Int(readLine()!)!
    let arr = readLine()!
            .replacingOccurrences(of: "[\\[\\]]", with: "", options: .regularExpression)
            .split(separator: ",")
            .map{ Int(String($0))! }
    
    var front = 0
    var end = n - 1
    var reverse = false
    var error = false
    
    for query in p {
        switch String(query) {
        case "R":
            swap(&front, &end)      // 순서 뒤집기
            reverse.toggle()        // 뒤집음 표시
        case "D":
            if !reverse && front <= end {           // 정방향일 때 비어있지 않으면
                front += 1
            } else if reverse && front >= end {     // 역방향일 때 비어있지 않으면
                front -= 1
            } else {                                // 비어있을 때 D하면 에러
                error = true
                break
            }
        default:
            break
        }
    }
    
    if error {
        result.write("error\n")
    } else {
        result.write("[")
        
        while (!reverse && front <= end) || (reverse && front >= end) {
            result.write("\(arr[front])")
            if front != end { result.write(",") }
            
            front += reverse ? -1 : 1
        }
        
        result.write("]\n")
    }
    
    T -= 1
}

print(result)

 

반응형

댓글