문제

사과 담기 게임

이미지
스크린 위에서 사과 여러개가 떨어질 때 바구니로 사과를 담기 위한 이동거리의 최솟값을 구하라

풀이

시작지점을 left와 right를 방정식으로 나타낼 수 있다.
left = 1
right = left + m - 1

/*
 5 1
 3
 1
 5
 3
 */

let input = readLine()!.split(separator: " ").map { Int($0)! }
let n = input[0]          // screen
let m = input[1]          // basket
let j = Int(readLine()!)! // count

var left = 1
var right = left + m - 1 // 그냉 m으로 해도 된다
var totalMove = 0

for _ in 0..<j {
    // 사과가 떨어지는 위치
    let pos = Int(readLine()!)!
    
    // 사과의 위치가 이미 바구니가 있는 위치이면 아래 바구니 이동 로직을 무시
    if pos >= left && pos <= right { continue }
   
    // 포지션이 바구니 안에 있으면 이동 안함
    if pos < left {
        let move = left - pos
        left -= move
        right -= move
        totalMove += move
    } else if pos > right {
        let move = pos - right
        right += move
        left += move
        totalMove += move
    }
}

print(totalMove)

Leave a comment