본문 바로가기
Algorithm/BOJ

[Algorithm/BOJ] 1406 - 에디터 Swift Python

by thoonk: 2021. 5. 11.
반응형

문제 풀이:

이 문제의 핵심은 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

 

반응형

댓글