๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/swift

[Swift] ๋ฐฑ์ค€ 18258๋ฒˆ - ํ 2

by hyebin (Helia) 2023. 3. 20.
๋ฐ˜์‘ํ˜•
๋ฐฑ์ค€ ๋ฌธ์ œ ๋ชจ์Œ

๋ฌธ์ œ ๋งํฌ

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

 

18258๋ฒˆ: ํ 2

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

www.acmicpc.net

 

๋ฌธ์ œ

์ •์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํ๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ, ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋ช…๋ น์€ ์ด ์—ฌ์„ฏ ๊ฐ€์ง€์ด๋‹ค.

  • push X: ์ •์ˆ˜ X๋ฅผ ํ์— ๋„ฃ๋Š” ์—ฐ์‚ฐ์ด๋‹ค.
  • pop: ํ์—์„œ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ์ •์ˆ˜๋ฅผ ๋นผ๊ณ , ๊ทธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ํ์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • size: ํ์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • empty: ํ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • front: ํ์˜ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ํ์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • back: ํ์˜ ๊ฐ€์žฅ ๋’ค์— ์žˆ๋Š” ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ํ์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ž…๋ ฅ

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

์ถœ๋ ฅ

์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ๋ช…๋ น์ด ์ฃผ์–ด์งˆ ๋•Œ๋งˆ๋‹ค, ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.

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

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜

  • ์ž๋ฃŒ ๊ตฌ์กฐ
  • ํ

์†Œ์Šค ์ฝ”๋“œ

var queue = [Int]()
var firstIndex = 0

for _ in 0..<Int(readLine()!)! {
    let input = readLine()!.split(separator: " ").map{String($0)}
    
    switch input[0] {
    case "push":
        queue.append(Int(input[1])!)
    case "pop":
        if queue.count-firstIndex == 0{
            print(-1)
        }else{
            print(queue[firstIndex])
            firstIndex += 1
        }
    case "size":
        print(queue.count - firstIndex)
    case "empty":
        print(queue.count-firstIndex == 0 ? 1 : 0)
    case "front":
        print(queue.count-firstIndex == 0 ? -1 : queue[firstIndex])
    case "back":
        print(queue.count-firstIndex == 0 ? -1 : queue.last!)
    default:
        break
    }
}
  • ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ
  • switch๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ช…๋ น์— ๋Œ€ํ•œ ๋™์ž‘ ๊ตฌํ˜„ 

๋ฌธ์ œ ํ’€์ด

  • ๋ผ์ด๋…ธ๋‹˜ ๋น ๋ฅธ ์ž…๋ ฅ FileIO ์‚ฌ์šฉ
 

๋ผ์ด๋…ธ๋‹˜์˜ ๋น ๋ฅธ ์ž…๋ ฅ readLine ๋ถ„์„ํ•˜๊ธฐ!

๋„์ž….. ์ œ๊ฐ€ ์กด๊ฒฝํ•˜๊ณ  ๋„์›€์„ ์ฃผ์‹  ๋ผ์ด๋…ธ๋‹˜์˜ ๋น ๋ฅธ readLine์„ ๋ถ„์„ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์˜ ๊นƒํ—™...

blog.naver.com

  • ๊ตฌ์กฐ์ฒด๋กœ ํ(queue)๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
    • pop์—์„œ remove๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜ start๋ฅผ 1 ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.
    • mutating
      • ํŠน์ • ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ๊ตฌ์กฐ์ฒด ๋˜๋Š” ์—ด๊ฑฐํ˜•์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ
  • main ํ•จ์ˆ˜์— ๋™์ž‘๋“ค์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    • FileIO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
    • if๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ช…๋ น์— ๋Œ€ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • output๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ •๋‹ต ์ฝ”๋“œ

import Foundation

final class FileIO {
    private var buffer:[UInt8]
    private var index: Int

    init(fileHandle: FileHandle = FileHandle.standardInput) {
        
        buffer = Array(fileHandle.readDataToEndOfFile())+[UInt8(0)] // ์ธ๋ฑ์Šค ๋ฒ”์œ„ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ ๋ฐฉ์ง€
        index = 0
    }

    @inline(__always) private func read() -> UInt8 {
        defer { index += 1 }

        return buffer.withUnsafeBufferPointer { $0[index] }
    }

    @inline(__always) func readInt() -> Int {
        var sum = 0
        var now = read()
        var isPositive = true

        while now == 10
            || now == 32 { now = read() } // ๊ณต๋ฐฑ๊ณผ ์ค„๋ฐ”๊ฟˆ ๋ฌด์‹œ
        if now == 45{ isPositive.toggle(); now = read() } // ์Œ์ˆ˜ ์ฒ˜๋ฆฌ
        while now >= 48, now <= 57 {
            sum = sum * 10 + Int(now-48)
            now = read()
        }

        return sum * (isPositive ? 1:-1)
    }

    @inline(__always) func readString() -> Int {
        var str = 0
        var now = read()

        while now == 10
            || now == 32 { now = read() } // ๊ณต๋ฐฑ๊ณผ ์ค„๋ฐ”๊ฟˆ ๋ฌด์‹œ
        while now != 10
            && now != 32 && now != 0 {
                str += Int(now)
                now = read()
        }
        
        return str
    }
}

func stringToAscii(_ str: String) -> Int {
    str.map { $0.asciiValue! }.map { Int($0) }.reduce(0) {$0 + $1}
}

let FRONT = stringToAscii("front")
let EMPTY = stringToAscii("empty")
let BACK = stringToAscii("back")
let SIZE = stringToAscii("size")
let POP = stringToAscii("pop")

struct Queue {
    private var nums = [Int]()
    private var start = 0
    private var end = 0
    
    var empty: Bool{
        start == end
    }
    var size: Int {
        end - start
    }
    mutating func pop() -> Int {
        if empty {
            return -1
        }
        let num = nums[start]
        start += 1
        return num
    }
    var front: Int {
        if empty {
            return -1
        }
        return nums[start]
    }
    var back: Int {
        if empty {
            return -1
        }
        return nums[end-1]
    }
    mutating func push(_ num: Int) {
        nums.append(num)
        end += 1
    }
}

func main() {
    let file = FileIO()
    let numCommands = file.readInt()
    
    var queue = Queue()
    var output = ""
    
    for _ in 1...numCommands {
        let line = file.readString()
        
        
        if line == FRONT {
            output += "\(queue.front)\n"
        } else if line == EMPTY {
            output += queue.empty ? "1\n" : "0\n"
            
        } else if line == BACK {
            output += "\(queue.back)\n"
            
        } else if line == SIZE {
            output += "\(queue.size)\n"
            
        } else if line == POP {
            output += "\(queue.pop())\n"
        } else {
            let value = file.readInt()
            queue.push( value)
        }
    }
    print(output)
}

main()
  • 400ms ์†Œ์š”
๋ฐ˜์‘ํ˜•