๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ์—๋””ํ„ฐ BOJ #1406

by seolhee2750 2021. 7. 30.
๋ฌธ์ œ ์„ค๋ช…

ํ•œ ์ค„๋กœ ๋œ ๊ฐ„๋‹จํ•œ ์—๋””ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด ํŽธ์ง‘๊ธฐ๋Š” ์˜์–ด ์†Œ๋ฌธ์ž๋งŒ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ์ง‘๊ธฐ๋กœ, ์ตœ๋Œ€ 600,000๊ธ€์ž๊นŒ์ง€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ํŽธ์ง‘๊ธฐ์—๋Š” '์ปค์„œ'๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ, ์ปค์„œ๋Š” ๋ฌธ์žฅ์˜ ๋งจ ์•ž(์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์˜ ์™ผ์ชฝ), ๋ฌธ์žฅ์˜ ๋งจ ๋’ค(๋งˆ์ง€๋ง‰ ๋ฌธ์ž์˜ ์˜ค๋ฅธ์ชฝ), ๋˜๋Š” ๋ฌธ์žฅ ์ค‘๊ฐ„ ์ž„์˜์˜ ๊ณณ(๋ชจ๋“  ์—ฐ์†๋œ ๋‘ ๋ฌธ์ž ์‚ฌ์ด)์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ๊ธธ์ด๊ฐ€ L์ธ ๋ฌธ์ž์—ด์ด ํ˜„์žฌ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ์œผ๋ฉด, ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ L+1๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ด ํŽธ์ง‘๊ธฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

L ์ปค์„œ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊น€ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ์•ž์ด๋ฉด ๋ฌด์‹œ๋จ)
D ์ปค์„œ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊น€ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ๋’ค์ด๋ฉด ๋ฌด์‹œ๋จ)
B ์ปค์„œ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•จ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ์•ž์ด๋ฉด ๋ฌด์‹œ๋จ)
์‚ญ์ œ๋กœ ์ธํ•ด ์ปค์„œ๋Š” ํ•œ ์นธ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์ปค์„œ์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋˜ ๋ฌธ์ž๋Š” ๊ทธ๋Œ€๋กœ์ž„
P $ $๋ผ๋Š” ๋ฌธ์ž๋ฅผ ์ปค์„œ ์™ผ์ชฝ์— ์ถ”๊ฐ€ํ•จ

์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง€๊ณ , ๊ทธ ์ดํ›„ ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด๊ฐ€ ์ฐจ๋ก€๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ช…๋ น์–ด๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ์ปค์„œ๋Š” ๋ฌธ์žฅ์˜ ๋งจ ๋’ค์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ๊ธธ์ด๊ฐ€ N์ด๊ณ , ์˜์–ด ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ธธ์ด๋Š” 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ž…๋ ฅํ•  ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ M(1 ≤ M ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ์ž…๋ ฅํ•  ๋ช…๋ น์–ด๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋ช…๋ น์–ด๋Š” ์œ„์˜ ๋„ค ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋กœ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์ž…๋ ฅ

abcd
3
P x
L
P y

์ถœ๋ ฅ

abcdyx

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import Foundation

var left = Array(readLine()!)
var right = [Character]()
let count = Int(readLine()!)!

for _ in 0..<count {
    let edit = readLine()!
    if edit == "L" && !left.isEmpty { right.append(left.removeLast()) }
    else if edit == "D" && !right.isEmpty { left.append(right.removeLast()) }
    else if edit == "B" && !left.isEmpty { left.removeLast() }
    else if edit.first! == "P" { left.append(edit.last!) }
}

print(String(left + right.reversed()))
  • ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ ํ’€์ดํ–ˆ๋‹ค.
  • ์ปค์„œ๋ฅผ ๊ธฐ์ค€, ์™ผ์ชฝ ๋ฌธ์ž๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด left์™€ ์˜ค๋ฅธ์ชฝ ๋ฌธ์ž๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด right๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.
  • L์ด ์ž…๋ ฅ๋์„ ๊ฒฝ์šฐ ์™ผ์ชฝ ๋ฐฐ์—ด์ด ๋น„์—ˆ๋Š”์ง€ ์ฒดํฌํ•ด์ฃผ๊ณ ,
    ๋น„์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ removeLast()๋ฅผ ์ด์šฉํ•˜์—ฌ
    left ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ง€์šฐ๋Š” ๋™์‹œ์— right ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.
  • D๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด์ด ๋น„์—ˆ๋Š”์ง€ ์ฒดํฌํ•ด์ฃผ๊ณ ,
    ๋น„์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ์—ญ์‹œ๋‚˜ removeLast()์ด์šฉํ•˜์—ฌ
    right ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ left ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.
  • B๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ์—๋Š” ์™ผ์ชฝ ๋ฐฐ์—ด์ด ๋น„์—ˆ๋Š”์ง€ ์ฒดํฌ, ์™ผ์ชฝ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•ด์ฃผ์—ˆ๋‹ค.
  • P๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ์—๋Š” ์™ผ์ชฝ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰์—, ์ž…๋ ฅํ•œ ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.
  • left, right ๋ฐฐ์—ด์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋ฐฐ์—ด ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜์—ฌ
    insert, remove ๋“ฑ์„ ์ด์šฉํ•ด์ค„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ณ„์† ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ
    ํ•œ ์นธ์”ฉ ์˜ฎ๊ฒจ์ฃผ๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.
    ๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ์Šคํƒ์„ ์ด์šฉํ–ˆ๋‹ค.
    ๐Ÿ‘‰  ์ฒ˜์Œ๋ถ€ํ„ฐ ์Šคํƒ์œผ๋กœ ํ‘ผ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ ,, ๋ฐฐ์—ด๋กœ ํ’€์—ˆ์„ ๋•Œ ์•„๋ฌด๋ฆฌ ์ˆ˜์ •ํ•ด๋„
    ๊ณ„์† ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋– ์„œ ์Šคํƒ์œผ๋กœ ์ƒˆ๋กœ ํ’€์—ˆ๋‹ค. ์•„๋ž˜๋Š” ๋ฐฐ์—ด๋กœ ํ’€์—ˆ๋˜ ํ’€์ด๋ฅผ ์ฒจ๋ถ€ํ•œ๋‹ค. 

 

(๋ฐฐ์—ด ํ’€์ด)

import Foundation

var input = Array(readLine()!).map({String($0)})
input.append(" ") // ๋งจ ๋’ค์— ๊ณต๋ฐฑ ์ถ”๊ฐ€ (์ปค์„œ๋ฅผ ์˜๋ฏธ)

let count = Int(readLine()!)!
var edit = ""

for _ in 0..<count {
    edit = readLine()! // ๋ช…๋ น์–ด ์ž…๋ ฅ
    if edit == "L" && input[input.startIndex] != " " { toLeft() }
    if edit == "D" && input[input.endIndex] != " " { toRight() }
    if edit == "B" && input[input.startIndex] != " " { Remove() }
    if edit.first! == "P" { Insert() }
}

print(input.joined().filter({$0 != " "}))

// 'L' ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
func toLeft() {
    let blank = input.firstIndex(of: " ")!
    input.remove(at: blank)
    input.insert(" ", at: blank - 1)
    return
}

// 'D' ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
func toRight() {
    let blank = input.firstIndex(of: " ")!
    input.remove(at: blank)
    input.insert(" ", at: blank + 1)
    return
}

// 'B' ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
func Remove() {
    let blank = input.firstIndex(of: " ")!
    input.remove(at: blank - 1)
    return
}

// 'P' ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
func Insert() {
    let blank = input.firstIndex(of: " ")!
    input.insert(String(edit.last!), at: blank)
    return
}

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์œ„์˜ ๋ฐฐ์—ด ํ’€์ด๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, ์Šคํƒ์œผ๋กœ ํ‘ธ๋‹ˆ ํ›จ์”ฌ ํšจ์œจ์ ์ด๊ณ  ์ฝ”๋“œ ์ž์ฒด๋„ ์•„์ฃผ ์งง์•„์ง„ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์•ž์œผ๋กœ๋„ remove, insert ๋“ฑ์„ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์€ ์ตœ๋Œ€ํ•œ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค.

 


 

๋ฌธ์ œ

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

๋Œ“๊ธ€