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