BOJ/Swift

백준 3020번 개똥벌레 Swift

띵지니어 2024. 11. 8. 23:59
반응형

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

 

 

내 코드

let input = readLine()!.split(separator: " ").map { Int($0)! }
let N = input[0]
let H = input[1]

var list = Array(repeating: 0, count: H)

// O(N)
for i in 0..<N {
    let wall = Int(readLine()!)!
    if i % 2 == 0 { // 짝수번째 일때
        list[0] += 1
        list[wall] -= 1
    } else { // 홀수번째 일때
        list[H-wall] += 1
    }
}
var result: [Int] = []

// O(N)
for i in 1..<list.count {
    list[i] = list[i] + list[i-1]
}

let minValue = list.min()!
let minCount = list.filter { $0 == minValue }.count
print(minValue, minCount)

 

Review

이 문제는, N의 크기가 200,000 이므로 시간 복잡도가 O(N^2)이 넘어가면 시간 초과가 뜨게 됩니다.

Imos method 이라는 유명한 문제인데, 누적합을 활용하여 풀었습니다.

이모스법을 요약하면

1. 벽의 시작(아래)과 끝(위)에 1과 -1을 써줍니다.

 

2. 해당 숫자들을 높이별로 다 더해줍니다. [3. -1, 1, -1, 1, -1, 1]

 

3. 더해준 숫자들을 아래서부터 누적합을 해줍니다. [3, 2, 3, 2, 3, 2, 3]

 

4. 누적합 리스트에서 최솟값과, 최솟값의 개수를 세어주면 문제에서 제시되는 장애물의 최솟값과 구간의 수를 쉽게 구할 수 있습니다.
[3, 2, 3, 2, 3, 2, 3]

반응형