반응형
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)
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
백준 7569번 토마토 - 스위프트(Swift) 풀이 + 그림 설명 (0) | 2022.01.18 |
---|---|
백준 10026번 적록색약 - 스위프트(Swift) 풀이 (0) | 2022.01.18 |
백준 2667번 단지번호붙이기 - 스위프트(Swift) 풀이 + 그림 설명 (0) | 2022.01.17 |
백준 1676번 팩토리얼 0의 개수 - 스위프트(Swift) 풀이 (0) | 2022.01.17 |
백준 2178번 미로 탐색 - 스위프트(Swift) 풀이 + 그림 설명 (0) | 2022.01.16 |
댓글