Algorithm/BOJ
[Algorithm/BOJ] 1406 - 에디터 Swift Python
thoonk:
2021. 5. 11. 21:18
반응형
문제 풀이:
이 문제의 핵심은 2개의 스택을 사용하는 것이다.
L: 왼쪽 스택에서 pop하고 그 값을 오른쪽 스택에 추가한다.
D: 오른쪽 스택에서 pop하고 그 값을 왼쪽 스택에 추가한다.
B: 왼쪽 스택에서 pop한다.
P: 왼쪽 스택에 값을 추가한다.
오른쪽 스택은 문자열이 거꾸로 추가되었으므로 마지막에 오른쪽 스택을 reversed해줘야 한다.
처음에 배열로 접근해서 풀었을 때 스위프트는 시간초과가 나고 파이썬은 같은 풀이로 푼 문제가 맞았다.
원인은 스위프트에서 readLine()!.split(separator: " ").map { Int(String($0))! } 를 통해
Int형 배열로 입력을 받는 과정에서 시간이 더 소모된 것이 영향이 있는 것 같다.
그래서 스위프트는 배열로 입력을 받지 말고 String으로 바로 풀어야 시간초과를 피할 수 있다.
코드:
Swift
// switch 풀이
var left = readLine()!
var right = ""
let m = Int(readLine()!)!
for _ in 0 ..< m {
let cmd = readLine()!
switch cmd {
case "L":
if !left.isEmpty {
right.append(left.removeLast())
}
case "D":
if !right.isEmpty {
left.append(right.removeLast())
}
case "B":
if !left.isEmpty {
left.removeLast()
}
default:
left.append(cmd.last!)
}
}
print(left + right.reversed())
// if 풀이 (gustn3065님의 풀이)
var left = readLine()!
var right = ""
for _ in 0 ..< Int(readLine()!)! {
let cmd = readLine()!
if cmd == "L", !left.isEmpty {
right.append(left.removeLast())
} else if cmd == "D", !right.isEmpty {
left.append(right.removeLast())
} else if cmd == "B" {
left.popLast()
} else {
left.append(cmd.last!)
}
}
print(left + right.reversed())
Python
import sys
input = sys.stdin.readline
left = list(input().strip())
right = []
n = int(input())
for _ in range(n):
cmd = input()
if cmd[0] == 'L' and left:
right.append(left.pop())
elif cmd[0] == 'D' and right:
left.append(right.pop())
elif cmd[0] == 'B' and left:
left.pop()
elif cmd[0] == 'P':
left.append(cmd[2])
print(''.join(left+list(reversed(right))))
문제:
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
반응형