[A&I Code Camp] Day42

Hood·2024년 11월 5일

A&I Code Camp

목록 보기
33/38
post-thumbnail

✍   Kotlin을 PS 문제 풀기

소속중인 A&I 동아리에서 코딩역량을 강화하고자
코딩캠프를 진행하며 작성한 포스트입니다.
해당 포스트는 kotlin을 기반으로 작성합니다.


슬라이딩 윈도우

이번 주 주제는 슬라이딩 윈도우 알고리즘이며
백준에 하루 한 문제를 풀어가며 작성할 것입니다.
슬라이딩 윈도우
해당 내용은 위 포스트에 작성하였습니다.

12847번

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

이 문제는 월세를 내야하는 n일 안에 최대 m일을 일할 수 있는데
여기서 m일 안에 벌 수 있는 돈의 최대값을 구해야 합니다.
여기서 알바는 연달아서 해야하며 퇴사를 하고 다시 일 할 수 없다는 조건이 있습니다.

Solve

  1. 일단 nm의 변수를 받아 줍니다.
  2. 여기서 n의 범위는 (1n100,000)1 ≤ n ≤ 100,000)이며 m의 범위는 (0mn)(0 ≤ m ≤ n) 이기에
    Long 타입의 배열을 받아줍니다.
  3. 그 뒤 m일 동안 일 할 수 있는 초기값 3개를 가져와 sum을 만들어주고
  4. 반복문을 통해 arr[x] - arr[x-m] 즉 첫 3개를 더한 다음 값과 이전 값의 차를 구해주어
    다음 연속 m개의 합을 구해주고 max 함수를 통해 anssum을 비교해
    더 큰 값을 ans로 넣어주어 풀어줍니다.
import java.io.StreamTokenizer
import kotlin.math.max

fun main() = with(StreamTokenizer(System.`in`.bufferedReader())){
    fun nextInt() : Int{
        nextToken()
        return nval.toInt()
    }

    val n = nextInt(); val m = nextInt()

    val arr = LongArray(n){
        nextInt().toLong()
    }

    var sum = 0L
    repeat(m){
        sum += arr[it]
    }

    var ans = sum
    for(x in m..<n){
        sum+=arr[x] - arr[x-m]
        ans = max(ans, sum)
    }
    println(ans)
}

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글