Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 매크로로 배열의 최댓값과 최솟값 차이 구하기


정수 값 여러 개가 담긴 정수 배열이 주어졌을 때, 배열 안에서 가장 작은 값과 가장 큰 값의 차이를 구하는 것이 이번 문제의 목표입니다. 이 문제는 C++의 매크로(macro) 기능을 활용해야 풀 수 있으며, 입력은 표준 입력(stdin)으로 받고 결과는 표준 출력(stdout)으로 출력합니다.

예를 들어 배열이 {120, 589, 324, 221, 234}라면 출력 결과는 다음과 같습니다.

The answer is : 469

배열에서 가장 큰 값은 589, 가장 작은 값은 120이며, 두 값의 차이인 469가 바로 정답이 됩니다.

문제 해결 절차

이 문제는 다음 단계에 따라 해결할 수 있습니다.

  1. 최솟값 변수 mini를 무한대(INF)로 초기화합니다.
  2. 최댓값 변수 maxi를 음의 무한대(-INF)로 초기화합니다.
  3. 배열 v의 모든 요소를 순회하며 다음을 수행합니다.
    • mini가 현재 요소보다 크면 mini를 해당 값으로 갱신합니다.
    • maxi가 현재 요소보다 작으면 maxi를 해당 값으로 갱신합니다.
  4. ans = maxi - mini를 계산합니다.
  5. 결괏값 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