MUKER_DEV with iOS

[swift] λ°±μ€€ - 1931번: νšŒμ˜μ‹€ λ°°μ • λ³Έλ¬Έ

πŸ€– μ•Œκ³ λ¦¬μ¦˜/BAEKJOON

[swift] λ°±μ€€ - 1931번: νšŒμ˜μ‹€ λ°°μ •

MUKER 2023. 1. 22. 00:35
 

1931번: νšŒμ˜μ‹€ λ°°μ •

(1,4), (5,7), (8,11), (12,14) λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

www.acmicpc.net


문제 ν‘ΈλŠ” 데 μžˆμ–΄ 도움이 λ˜λ„λ‘ λ‚˜μ˜ 풀이와 κ°œμ„ λœ 풀이λ₯Ό μ˜¬λ¦½λ‹ˆλ‹€.
λ˜ν•œ 풀이 ν›„ λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό 보고 μ°Έκ³ ν• λ§Œν•œ 풀이도 μ˜¬λ¦½λ‹ˆλ‹€.

- λ¬Έμ œμ— 따라 λ‚˜μ˜ ν’€μ΄λ§Œ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•΄λ‹Ή 풀이듀은 풀이 쀑 ν•˜λ‚˜μΌ 뿐 μ΅œμ„ μ˜ ν’€μ΄λŠ” 아닐 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ‚˜μ˜ 풀이

let meetingCount = Int(readLine()!)!
var time = (0..<meetingCount).map { _ in readLine()!.split(separator: " ").map { Int($0)! }}.sorted { $0[1] < $1[1] }
var endTime = time[0][1]
var count = 1
while true {
    let temp = time.filter { $0[0] >= endTime }
    if temp.isEmpty { break }
    time = temp
    endTime = temp[0][1]
    count += 1
}
print(count)

 

주의!! μ˜€λ‹΅ ν’€μ΄μž…λ‹ˆλ‹€.

μ‹œκ°„μ΄ˆκ³Όλ‘œ μ˜€λ‹΅μ΄ λ‚˜μ˜΅λ‹ˆλ‹€.

 

μš”μ¦˜ 탐색과 μ•Œκ³ λ¦¬μ¦˜μ˜ μ’…λ₯˜λ₯Ό 더 κ³΅λΆ€ν•˜κ³ 

문제λ₯Ό ν’€μ–΄μ•Όκ² λ‹€λŠ” 생각이 λ“­λ‹ˆλ‹€.

 

μ™„μ „νƒμƒ‰μœΌλ‘œ ν’€ 경우

λ¬Έμ œμ—μ„œ 졜적의 μ•Œκ³ λ¦¬μ¦˜μ„ μš”κ΅¬ν•˜λŠ” κ²½μš°κ°€ λ§Žμ•„

μ‹œκ°„μ œν•œμ— κ±Έλ¦¬λ„€μš”.

 

이번 λ¬Έμ œλŠ”

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό 보고

μ‹œκ°„ λ³΅μž‘λ„μ— μ΄ˆμ μ„ 맞좰

곡뢀해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 


κ°œμ„ λœ 풀이

let meetingCount = Int(readLine()!)!
var time = (0..<meetingCount).map { _ in readLine()!.split(separator: " ").map { Int($0)! }}
time.sort { $0[1] < $1[1] || $0[1] == $1[1] && $0[0] < $1[0] }
var endTime = -1
var count = 0
for i in time {
    if i[0] >= endTime {
        endTime = i[1]
        count += 1
    }
}
print(count)

// μ‹œκ°„: μ•½ 164ms

 

일단 μ‹œκ°„μ„ 쀄여 ν†΅κ³Όν–ˆμŠ΅λ‹ˆλ‹€.

 

κ°œμ„  λΆ€λΆ„ 1

time λ³€μˆ˜λ₯Ό λ§Œλ“€ λ•Œ

κ³ μ°¨ν•¨μˆ˜λ₯Ό 계속 μ΄μ–΄μ„œ λ‚˜μ—΄ν–ˆμ—ˆλŠ”λ°μš”

 

var time = (0..<meetingCount).map { _ in readLine()!.split(separator: " ").map { Int($0)! }}.sorted { $0[1] < $1[1] }
time.sort { $0[1] < $1[1] || $0[1] == $1[1] && $0[0]

 

μ΄λ ‡κ²Œ 말이죠

근데 μ—¬κΈ°μ„œ sorted에 μ‚Όν•­μ—°μ‚°μžλ₯Ό μ“Έλ €κ³  ν•˜λ‹ˆ μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ”°λ‘œ μ •λ ¬ 뢀뢄은 λΉΌμ€¬μŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή κ°œμ„ μ€ 문제의 μ‹œκ°„λ³΅μž‘λ„μ™€ 상관은 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

κ°œμ„  λΆ€λΆ„ 2

μ—¬κΈ°μ„œ μ‹œκ°„λ³΅μž‘λ„λ₯Ό ν•΄κ²°ν–ˆλŠ”λ°μš”.

whileλ¬Έ μ•ˆμ— filterλ₯Ό λ„£μœΌλ‹ˆ

while반볡이 될 λ•Œλ§ˆλ‹€ time배열을 μ „λΆ€ 완전탐색 ν–ˆλ˜ 게

μ‹œκ°„μ΄ˆκ³Όμ˜ μ›μΈμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

 

κ·Έλž˜μ„œ κ°œμ„  λΆ€λΆ„ 1에 μ •λ ¬ 쑰건을 μΆ”κ°€ν–ˆλ˜ κ±΄λ°μš”.

μ •λ ¬λ‘œ μ›ν•˜λŠ” μˆœμ„œλ₯Ό λ‹€ λ§žμΆ”κ³  λ‚˜λ‹ˆ

λ°°μ—΄μ˜ 완전탐색을 λ°˜λ³΅ν•  일이 μ—†μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

 


μ°Έκ³ ν• λ§Œν•œ 풀이

import Foundation

final class FileIO {
    
    @inline(__always) private var buffer: [UInt8] = Array(FileHandle.standardInput.readDataToEndOfFile()) + [0], byteIdx = 0
    
    @inline(__always) private func readByte() -> UInt8 {
        defer { byteIdx += 1 }
        return buffer.withUnsafeBufferPointer { $0[byteIdx] }
    }
    
    @inline(__always) func readInt32() -> Int32 {
        var number: Int32 = 0, byte = readByte(), isNegative = false
        while byte == 10 || byte == 32 { byte = readByte() }
        if byte == 45 { byte = readByte(); isNegative = true }
        while 48...57 ~= byte { number = number * 10 + Int32(byte - 48); byte = readByte() }
        return number * (isNegative ? -1 : 1)
    }
}

let file = FileIO()
let n = Int(file.readInt32())

var times = [(Int32, Int32)]()
for _ in 0..<n {
    times.append((file.readInt32(), file.readInt32()))
}

times.sort {
    if $0.0 == $1.0 { return $0.1 < $1.1 }
    return $0.0 < $1.0
}

var index = 0
var lhs = times.first!
var count = 1

while index < n-1 {
    let rhs = times[index+1]
    
    if lhs.1 <= rhs.0 {
        lhs = rhs
        count += 1
    } else if lhs.1 >= rhs.1 {
        lhs = rhs
    }
    
    index += 1
}

print(count)

// μ‹œκ°„: 40ms

 

μ‹œκ°„μ„ 40msκΉŒμ§€ 쀄인 μ½”λ“œλ₯Ό κ°€μ Έμ™€λ΄€μŠ΅λ‹ˆλ‹€.

 

정확이 λœ»μ„ ν•΄μ„ν•˜κΈ°λŠ” νž˜λ“€μ§€λ§Œ

λ©”λͺ¨λ¦¬λ₯Ό 적게 μ°¨μ§€ν•˜λŠ” νƒ€μž…μœΌλ‘œ κ°•μ œν•΄

μ‹œκ°„μ„ 쀄인 κ±° κ°™μŠ΅λ‹ˆλ‹€.