프로그래밍 면접이나 코딩 테스트에서 흔히 등장하는 문제는 다양한 상황에서의 시간 계산 문제입니다. 이번 포스트에서는 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단계: 알고리즘 설계
이 문제를 해결하기 위해서 다음과 같은 알고리즘을 사용할 수 있습니다:
- 빈 배열을 생성하여 각 사용자의 대기 시간을 저장합니다.
- 변수
totalTime
을 0으로 초기화합니다. 이는 누적 대기 시간을 저장하는 데 사용됩니다. - 각 사용자의 인출 시간에 대해 반복문을 수행하여 대기 시간을 계산합니다:
- 현재 사용자의 대기 시간은
totalTime
으로 설정합니다. totalTime
에 현재 사용자의 인출 시간을 더합니다.- 대기 시간 배열을 반환합니다.
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 인출 시간을 계산하는 문제에 대해 알아보았습니다. 이 문제는 알고리즘 설계 및 시간 계산의 기초를 익히는 데 유용한 연습이 될 수 있습니다. 자바스크립트를 통해 구현한 과정을 통해, 실제 코딩 테스트에서 비슷한 문제를 접했을 때 보다 쉽게 접근할 수 있는 방법을 배웠기를 바랍니다. 이 문제를 통해 알고리즘의 기본적 접근 방법과 시간 복잡도를 이해하고, 실전 문제 해결 능력을 향상시키는 데 도움이 되었기를 바랍니다.