정수 값 여러 개가 담긴 정수 배열이 주어졌을 때, 배열 안에서 가장 작은 값과 가장 큰 값의 차이를 구하는 것이 이번 문제의 목표입니다. 이 문제는 C++의 매크로(macro) 기능을 활용해야 풀 수 있으며, 입력은 표준 입력(stdin)으로 받고 결과는 표준 출력(stdout)으로 출력합니다.
예를 들어 배열이 {120, 589, 324, 221, 234}라면 출력 결과는 다음과 같습니다.
The answer is : 469
배열에서 가장 큰 값은 589, 가장 작은 값은 120이며, 두 값의 차이인 469가 바로 정답이 됩니다.
문제 해결 절차
이 문제는 다음 단계에 따라 해결할 수 있습니다.
- 최솟값 변수
mini를 무한대(INF)로 초기화합니다. - 최댓값 변수
maxi를 음의 무한대(-INF)로 초기화합니다. - 배열 v의 모든 요소를 순회하며 다음을 수행합니다.
mini가 현재 요소보다 크면mini를 해당 값으로 갱신합니다.maxi가 현재 요소보다 작으면maxi를 해당 값으로 갱신합니다.
ans = maxi - mini를 계산합니다.- 결괏값
ans를 출력합니다.
구현 예제
아래 코드를 통해 실제 구현 방법을 확인해 보겠습니다.
#define minmac(a, b) a = min(a, b)
#define maxmac(a, b) a = max(a, b)
#define INF ((1 << 31)-2)
#define input(a) cin >> a
#define toStr(a) string("The answer is :")
#define FOO(a, b)
#define foreach(a, b) for (int i = 0; i < a.size(); ++i)
#include <iostream>
#include <vector>
using namespace std;
FOO(minmac, <)
FOO(maxmac, >)
int main(){
int n; cin >> n;
vector<int> v(n);
foreach(v, i) {
input(v)[i];
}
int mini = INF;
int maxi = -INF;
foreach(v, i) {
minmac(mini, v[i]);
maxmac(maxi, v[i]);
}
int ans = maxi - mini;
cout << toStr(The answer is :) <<' '<< ans;
return 0;
}
주요 매크로 살펴보기
minmac(a, b): a와 b 중 더 작은 값을 a에 저장합니다.maxmac(a, b): a와 b 중 더 큰 값을 a에 저장합니다.INF: 무한대 역할을 하는 상수로,((1 << 31) - 2)로 정의되어 초기값 설정에 사용됩니다.foreach(a, b): 벡터의 모든 요소를 순회하기 위한 반복문 매크로입니다.toStr(a): 출력에 사용될 문자열을 생성하는 매크로입니다.
이처럼 매크로를 활용하면 반복적인 코드를 줄이고 로직을 간결하게 표현할 수 있습니다. 다만 매크로는 전처리 단계에서 단순 치환되므로, 디버깅이 어려워질 수 있다는 점도 함께 기억해 두면 좋습니다.
입력
5 120 589 324 221 234
출력
The answer is : 469