스위프트 코딩테스트 강좌, ATM 인출 시간 계산하기

안녕하세요! 이번 글에서는 스위프트로 코딩테스트를 대비하는 데 유용한 알고리즘 문제인 ATM 인출 시간 계산하기를 다뤄보겠습니다. 이 문제를 통해 우리는 배열과 정렬, 그리고 기본적인 수학적 사고를 활용하여 문제를 해결하는 과정을 단계별로 진행할 것입니다.

문제 설명

길다란 줄을 서서 ATM에서 돈을 인출하려는 사람들이 있습니다. 각 사람은 ATM을 이용하는 데 필요한 시간(초)을 알고 있습니다. 모든 사람이 줄을 서서 순서에 따라 ATM을 이용하게 됩니다. 이를 모두 이용하는데 소요되는 총 시간을 계산하는 프로그램을 작성해야 합니다.

즉, 아래와 같은 형태의 입력이 주어졌을 때:

  • 입력: [3, 1, 4, 3, 2]
  • 출력: 32

첫 번째 사람은 3초, 두 번째 사람은 1초, 세 번째는 4초, … 의 시간이 걸린다고 가정했을 때, 모든 사람이 각각 ATM을 사용하기 위해 소요되는 시간의 합은 3 + (3 + 1) + (3 + 1 + 4) + (3 + 1 + 4 + 3) + (3 + 1 + 4 + 3 + 2) = 32초가 됩니다.

문제 접근 방법

이 문제를 해결하기 위해서는 다음의 단계를 따를 수 있습니다:

  1. 시간이 걸리는 순서를 오름차순으로 정렬합니다.
  2. 각 사람의 인출 시간을 누적하여 전체 인출 시간을 계산합니다.

구현 단계

1단계: 입력 정의 및 정렬

우선 입력으로 주어진 시간을 정렬하여 가장 빠른 인출 시간이 먼저 오도록 하겠습니다. 이를 위해 Swift 언어의 sort() 메서드를 사용할 수 있습니다.

let withdrawalTimes = [3, 1, 4, 3, 2]
let sortedTimes = withdrawalTimes.sorted()

2단계: 총 시간 계산

이제 정렬된 배열을 사용하여 각 사람의 인출 순서에 따른 누적 시간을 계산해보겠습니다.

var totalTime = 0
var accumulatedTime = 0

for time in sortedTimes {
    accumulatedTime += time
    totalTime += accumulatedTime
}

3단계: 전체 코드

모든 단계를 합쳐 Swift 프로그램을 작성해보면 다음과 같습니다:

func calculateTotalWithdrawalTime(withdrawalTimes: [Int]) -> Int {
    let sortedTimes = withdrawalTimes.sorted()
    var totalTime = 0
    var accumulatedTime = 0

    for time in sortedTimes {
        accumulatedTime += time
        totalTime += accumulatedTime
    }
    
    return totalTime
}

let times = [3, 1, 4, 3, 2]
let total = calculateTotalWithdrawalTime(withdrawalTimes: times)
print("전체 인출 시간: \(total)초")

코드 설명

위의 코드는 먼저 입력받은 인출 시간 목록을 받고, 이를 정렬한 후 for 루프를 통해 각 사용자가 걸리는 시간을 누적하여 전체 시간을 계산합니다. 각 단계를 자세히 살펴보겠습니다.

  • calculateTotalWithdrawalTime(withdrawalTimes: [Int]) -> Int: 인출 시간을 입력받아 총 소요 시간을 반환하는 함수입니다.
  • let sortedTimes = withdrawalTimes.sorted(): Swift의 sort 기능을 이용해 배열을 오름차순으로 정렬합니다.
  • accumulatedTime += time: 각 사람의 인출 시간을 누적하여 계산합니다.
  • totalTime += accumulatedTime: 누적된 시간을 총 시간에 더합니다.

결과 확인

위 코드를 실행하면 주어진 인출 시간 [3, 1, 4, 3, 2]에 대해 총 인출 시간이 32초라는 결과를 출력하게 됩니다.

이 방법을 통해 다양한 입력에 대해 충분히 테스트를 진행할 수 있습니다. 예를 들어:

let testTimes = [2, 5, 3, 1, 4]
let testTotal = calculateTotalWithdrawalTime(withdrawalTimes: testTimes)
print("테스트 인출 시간: \(testTotal)초")

이렇게 하면 테스트 케이스에 맞는 결과가 출력될 것입니다.

결론

이번 글을 통해 ATM 인출 시간 계산 문제를 해결하는 과정을 살펴보았습니다. 이 문제는 기본적인 배열 다루기, 정렬, 누적 합 계산 등 알고리즘의 기초를 연습할 수 있는 좋은 예시입니다. 스위프트를 사용하여 실제로 문제를 구현해보니 알고리즘의 이해가 더욱 깊어졌습니다. 코딩테스트를 준비하면서 이런 수준의 문제들을 많이 풀어보는 것이 중요합니다.

코딩테스트를 준비하시면서 도움이 되셨기를 바랍니다. 추가적인 문제나 궁금한 점이 있다면 댓글로 남겨주세요!