자바스크립트 코딩테스트 강좌, ATM 인출 시간 계산하기

프로그래밍 면접이나 코딩 테스트에서 흔히 등장하는 문제는 다양한 상황에서의 시간 계산 문제입니다. 이번 포스트에서는 ATM에서의 인출 시간을 계산하는 알고리즘 문제를 다뤄보겠습니다. 여러 사용자가 동시에 ATM을 사용한다고 가정할 때, 각 사용자가 대기할 예상 시간을 계산하는 알고리즘을 작성해 보겠습니다.

문제 설명

하나의 ATM 기계가 있다고 가정합니다. 이 ATM에는 여러 사용자가 очередь에 대기하고 있습니다. 각각의 사용자는 특정 시간에 ATM을 이용할 수 있으며, ATM을 사용하는 데 필요한 시간은 개인에 따라 다를 수 있습니다.

주어진 입력으로는 사용자의 인출 시간이 배열로 주어집니다. 배열의 인덱스는 사용자의 순번을 나타내며, 해당 인덱스에 저장된 값은 해당 사용자가 ATM을 이용하는 데 걸리는 시간을 초로 나타냅니다. 예를 들어, [5, 3, 8]이라는 배열이 주어진 경우, 첫 번째 사용자는 5초, 두 번째 사용자는 3초, 세 번째 사용자는 8초 동안 ATM을 사용합니다.

입력

[5, 3, 8]

출력

각 사용자가 대기하는 데 걸리는 시간의 배열: [0, 5, 8]

위의 예에서 첫 번째 사용자는 대기 시간이 0초이므로 즉시 사용할 수 있습니다. 두 번째 사용자는 첫 번째 사용자의 인출 시간이 끝난 후 사용할 수 있으므로 대기 시간이 5초입니다. 세 번째 사용자는 두 번째 사용자의 대기 시간이 끝난 후 사용할 수 있으므로 대기 시간이 8초입니다.

문제 해결 과정

1단계: 문제 이해하기

문제를 이해하기 위해서는 다음을 명확히 해야 합니다:

  • ATM을 사용하는 각 사용자는 앞선 사용자의 인출이 끝날 때까지 대기해야 한다.
  • 대기 시간을 계산하기 위해서는 누적 시간을 추적해야 한다.
  • 각 사용자가 인출되는 순서에 따라 대기 시간을 계산해야 하며, 그 결과를 배열로 반환해야 한다.

2단계: 알고리즘 설계

이 문제를 해결하기 위해서 다음과 같은 알고리즘을 사용할 수 있습니다:

  1. 빈 배열을 생성하여 각 사용자의 대기 시간을 저장합니다.
  2. 변수 totalTime을 0으로 초기화합니다. 이는 누적 대기 시간을 저장하는 데 사용됩니다.
  3. 각 사용자의 인출 시간에 대해 반복문을 수행하여 대기 시간을 계산합니다:
    • 현재 사용자의 대기 시간은 totalTime으로 설정합니다.
    • totalTime에 현재 사용자의 인출 시간을 더합니다.
  4. 대기 시간 배열을 반환합니다.

3단계: 코드 구현

이제 알고리즘을 자바스크립트 코드로 구현해보겠습니다.

function calculateWaitTimes(atmTimes) {
    let waitTimes = [];
    let totalTime = 0;

    for (let i = 0; i < atmTimes.length; i++) {
        waitTimes[i] = totalTime; // 현재 사용자의 대기 시간
        totalTime += atmTimes[i]; // 누적 시간 업데이트
    }

    return waitTimes;
}

// 예제 실행
const inputTimes = [5, 3, 8];
const outputWaitTimes = calculateWaitTimes(inputTimes);
console.log(outputWaitTimes); // [0, 5, 8]

테스트 및 검증

함수를 구현한 후 다양한 테스트 케이스를 사용하여 올바른 결과를 출력하는지 검증해 보겠습니다.

console.log(calculateWaitTimes([0, 0, 0]));       // [0, 0, 0]
console.log(calculateWaitTimes([1, 2, 3]));       // [0, 1, 3]
console.log(calculateWaitTimes([10, 20, 30]));    // [0, 10, 30]
console.log(calculateWaitTimes([5]));              // [0]
console.log(calculateWaitTimes([]));               // []

복잡도 분석

이 알고리즘의 시간 복잡도는 O(n)입니다. 배열을 한 번 순회하므로 사용자의 수에 비례하여 시간이 증가합니다. 공간 복잡도 또한 O(n)으로, 대기 시간을 저장하기 위한 배열을 필요로 하기 때문입니다.

마치며

이번 포스트에서는 ATM 인출 시간을 계산하는 문제에 대해 알아보았습니다. 이 문제는 알고리즘 설계 및 시간 계산의 기초를 익히는 데 유용한 연습이 될 수 있습니다. 자바스크립트를 통해 구현한 과정을 통해, 실제 코딩 테스트에서 비슷한 문제를 접했을 때 보다 쉽게 접근할 수 있는 방법을 배웠기를 바랍니다. 이 문제를 통해 알고리즘의 기본적 접근 방법과 시간 복잡도를 이해하고, 실전 문제 해결 능력을 향상시키는 데 도움이 되었기를 바랍니다.