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

최근 수년간 IT 업계에서는 알고리즘 및 문제 해결 능력이 중요한 평가 요소로 자리잡고 있습니다. 이러한 기조의 연장선으로, 많은 기업들이 코딩테스트를 통해 지원자의 능력을 평가하고 있습니다.
이번 글에서는 C++을 활용하여 ‘ATM 인출 시간 계산하기’ 문제를 통해 기본적인 알고리즘 문제 해결 능력을 향상시키고자 합니다.

문제 설명

ATM에서는 각 사용자의 인출 요청이 들어올 때마다 요청이 처리되는 데 소요되는 시간이 다릅니다.
예를 들어, 한 사용자가 1분 후에 인출을 요청하면 그 시간은 모두 처리되고, 그 사용자는 1분 후에 인출할 수 있습니다.
만약 여러 사용자가 동시에 인출을 요청할 경우, 요청은 FIFO(선입선출)로 처리되므로, 먼저 요청된 사용자에게 먼저 처리가 이루어집니다.

사용자의 요청이 들어오는 순서와 각 요청의 소요 시간이 주어졌을 때, 모든 사용자가 인출을 완료하기 위해서 필요한 총 시간을 계산하여 출력하는 프로그램을 작성하시오.

입력 형식

  • 첫 번째 줄에는 정수 N(1 ≤ N ≤ 1000)이 주어지며, 이는 인출 요청의 수를 나타냅니다.
  • 두 번째 줄에는 인출 요청에 대한 소요 시간이 공백으로 구분되어 N개의 정수 형태로 주어집니다. (1 ≤ 각 요청 소요 시간 ≤ 100)

출력 형식

  • 모든 사용자가 인출을 완료하는 데 걸리는 총 시간을 출력합니다.

예시 입력

5
3 1 4 3 2

예시 출력

32

문제 해결 과정

문제의 핵심은 각 사용자가 인출을 완료하는 데 필요한 시간을 모두 합산하는 것입니다.
이 과정에서 우리는 요청이 수행되는 순서를 고려해야 합니다. 요청이 FIFO 방식으로 처리되므로, 먼저 요청된 사용자가 먼저 통과합니다.
우리는 이 문제를 해결하기 위해 다음과 같은 단계를 따릅니다.

1단계: 입력값 읽기

먼저 사용자로부터 요청의 수와 요청 시간들을 읽어야 합니다. C++에서는 표준 입력을 통해 데이터를 읽을 수 있습니다.


#include <iostream>
#include <vector>

using namespace std;

int main() {
    int N;
    cin >> N;

    vector<int> times(N);
    for (int i = 0; i < N; i++) {
        cin >> times[i];
    }

    return 0;
}

2단계: 총 시간 계산하기

각 사용자의 요청 시간은 요청이 처리되는 동안 그 앞에 있는 요청들 때문에 대기하는 시간이 발생합니다.
따라서 각 사용자가 요청을 완료하기 위해 소요되는 시간은 그들의 요청 소요 시간과 이전 사용자의 요청 소요 시간을 합산해야 합니다.
이를 통해 두 번째 사용자부터는 첫 번째 사용자의 소요 시간만큼의 대기 시간이 발생하게 됩니다.


#include <iostream>
#include <vector>

using namespace std;

int main() {
    int N;
    cin >> N;

    vector<int> times(N);
    for (int i = 0; i < N; i++) {
        cin >> times[i];
    }

    int totalTime = 0;
    int currentTime = 0;

    for (int i = 0; i < N; i++) {
        currentTime += times[i]; // 현재까지의 시간에 요청 소요 시간을 더함
        totalTime += currentTime; // 총 시간에 현재까지의 시간을 더함
    }

    cout << totalTime << endl; // 최종 총 시간 출력

    return 0;
}

3단계: 코드 설명

위의 코드에서 첫 번째 부분은 표준 입력으로부터 데이터를 읽기 위한 부분입니다.
vector<int> times(N);는 요청 소요 시간을 저장하기 위한 동적 배열을 생성합니다.
두 번째로, currentTime이라는 변수를 사용하여 현재까지의 시간이 축적됩니다.
사용자의 요청이 들어올 때마다 currentTime에 해당 요청의 소요 시간을 더하고, 이를 총 시간 totalTime에 축적하는 방식입니다.

전체 코드


#include <iostream>
#include <vector>

using namespace std;

int main() {
    int N;
    cin >> N; // 요청 수 입력받기

    vector<int> times(N); // 요청 소요 시간을 담을 벡터 선언
    for (int i = 0; i < N; i++) {
        cin >> times[i]; // 각 요청의 소요 시간 입력받기
    }

    int totalTime = 0; // 모든 요청 소요 시간 누적
    int currentTime = 0; // 현재 처리 시간 누적

    for (int i = 0; i < N; i++) {
        currentTime += times[i]; // 요청 소요 시간을 더함
        totalTime += currentTime; // 현재까지의 총 시간에 추가
    }

    cout << totalTime << endl; // 최종 총시간 출력

    return 0;
}

결론

이와 같은 문제를 해결함으로써, 알고리즘의 이해도와 C++ 프로그래밍 언어에 대한 이해도를 높일 수 있습니다.
각종 코딩테스트나 알고리즘 대회에서 유용하게 사용할 수 있는 기초적인 문제 해결 능력을 기르는 데 도움이 될 것입니다.
다양한 문제를 통해 실력을 쌓고 면접 준비를 하는 것이 중요하며, 이번 강좌를 통해 이러한 기본기를 다질 수 있었으면 합니다.