๋ฐฑ์ค ๋ฌธ์ ๋ชจ์
๋ฌธ์ ๋งํฌ
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() ๋ฉ์๋๋ณด๋ค ๋น ๋ฅด๊ฒ ๋์
- FileIO์ ๋ํ ์ค๋ช
- https://m.blog.naver.com/gustn3964/222258493870
๋ผ์ด๋ ธ๋์ ๋น ๋ฅธ ์ ๋ ฅ 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 ์์
'โจ๏ธ Language > swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๋ฐฑ์ค 2164๋ฒ - ์นด๋2 (0) | 2023.03.21 |
---|---|
[Swift] ๋ฐฑ์ค 1158๋ฒ - ์์ธํธ์ค ๋ฌธ์ (0) | 2023.03.20 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค LV.1 ๋ฐํํ๋ฉด ์ ๋ฆฌ (0) | 2023.03.19 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค LV.1 ๋์ถฉ ๋ง๋ ์ํ (0) | 2023.03.19 |
[Swift] ๋ฐฑ์ค 9012๋ฒ - ๊ดํธ (0) | 2023.03.18 |