문제 분석
크기가 N인 배열을 받아서, K의 간격으로 구간합을 구하고,
구간합 결과의 리스트 중에서 가장 큰 값을 return 하는 문제
N의 크기가 100,000 이므로, O(N^2)의 접근은 불가하다.
1. 가장 단순한 방법
배열을 탐색하며, K 간격의 구간합을 모두 구해서 최대값을 return
K는 1..<N이므로, K가 N인 경우에 O(N^2)이 되므로 불가하다.
2. 슬라이딩 윈도우 식으로
최초 구간합을 구하고, 한 칸식 우측으로 밀어가면서, head를 빼고, tail을 더하는 방식
무난한 O(N)으로 가능해 보인다.
의사 코드
n, k에 입력을 받는다.
degreesArr 배열에 입력을 받는다.
window: Int, 구간합, 최초 K개의 합으로 초기화 한다.
maxValue: Int, return할 최대값, window로 초기화 한다.
for i in 0..<n - k 의 범위를 탐색한다.
maxValue = maxValue > tmpWindow ? maxValue : tmpWindow
maxValue를 return 한다.
나의 풀이
import Foundation
let input = readLine()!.split(separator: " ").map { Int($0)! }
let n = input[0], k = input[1]
let degreesArr = readLine()!.split(separator: " ").map { Int($0)! }
var window = degreesArr[0..<k].reduce(0) { $0 + $1 }
var maxValue = window
for i in 0..<n - k {
window = window - degreesArr[i] + degreesArr[i + k]
maxValue = maxValue > window ? maxValue : window
}
print(maxValue)
회고
백준에서 입력 받는 법을 연습해봤다.
let n = input[0], k = input[1] 이렇게 입력 받는 형태를 기억하자.
'Dev > PS' 카테고리의 다른 글
[Swift 알고리즘] 네트워크 - 프로그래머스 (0) | 2024.02.01 |
---|---|
[Swift 알고리즘] 타겟 넘버 - 프로그래머스 (1) | 2024.02.01 |
[Swift 알고리즘] 모의고사 - 프로그래머스 (0) | 2024.01.31 |
[Swift 알고리즘] 최소 직사각형 - 프로그래머스 (0) | 2024.01.31 |
[Python 알고리즘] 우물 안 개구리 - 소프티어 (1) | 2024.01.28 |