{ }codelper
포인터여러 값 돌려주기P0073

포인터로 돌려받는 최소·최대·합

첫 줄에 n, 둘째 줄에 정수 n개가 주어진다.
이 수들의 최솟값, 최댓값, 합을 빈칸 하나씩 띄워 한 줄로 출력하라.
배열과 길이, 그리고 결과 세 개를 담을 부른 쪽 변수의 주소를 받아서 그 자리에 최솟값·최댓값·합을 써 넣는 함수 stats를 만들어 풀어 보자(C는 포인터 int *, C++는 참조 int&도 된다).
main은 이 함수를 한 번 부른 뒤 세 변수를 출력한다.

입력
1 ≤ n ≤ 100,000, 모든 수는 -1,000,000,000 이상 1,000,000,000 이하의 정수
출력
한 줄: 최솟값 최댓값 합
예시 1 · stdin
4
3 8 1 6
stdout
1 8 18
예시 2 · stdin
3
-5 -2 -9
stdout
-9 -2 -16
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 2개 언어 풀이

이 문제는 C·C++만 받아요.
부른 쪽 변수의 주소를 넘겨 함수가 결과를 써 넣는 포인터는 두 언어에만 있고, Python·JavaScript·TypeScript·Java·크레이콘에는 없어요(C#은 unsafe 안에서만).
C는 void stats(const int *a, int n, int *mn, int *mx, long long *sum)로 받고 stats(a, n, &mn, &mx, &sum)처럼 &로 주소를 넘긴 뒤 함수 안에서 *mn = ...로 써요.
C++는 같은 일을 참조 int& mn으로 더 간단히 하고, 부를 때 &도 필요 없어요.
다른 언어라면 Python return lo, hi, s, C# 튜플이나 out int mn, Java는 배열이나 객체로 묶어서 여러 값을 돌려줘요.
함정 셋: ① int *mn 대신 int mn으로 받으면 함수가 복사본에만 써서 부른 쪽 변수는 처음 값 그대로예요.
오류도 없어요.
② 합은 최대 10억 × 10만 = 10¹⁴라서 int(약 21억)를 넘어요.
long long과 %lld를 써요.
③ 최솟값·최댓값을 0으로 시작하면 수가 모두 양수일 때 최솟값이, 모두 음수일 때 최댓값이 0으로 나와요.
첫 칸 a[0]으로 시작해요.

C++main.cpp · 27 줄
#include <iostream>#include <vector> // C++는 같은 일을 참조(&)로 한다. 포인터 int* 로 받아도 되지만 참조는 null이 될 수 없다void stats(const std::vector<int>& a, int& mn, int& mx, long long& sum) {    mn = mx = a[0];    sum = 0;    for (int v : a) {        if (v < mn) mn = v;        if (v > mx) mx = v;        sum += v;    }} int main() {    std::ios::sync_with_stdio(false);    std::cin.tie(nullptr);    int n;    std::cin >> n;    std::vector<int> a(n);    for (int& v : a) std::cin >> v;     int mn, mx;    long long sum;    stats(a, mn, mx, sum);    std::cout << mn << " " << mx << " " << sum << "\n";}
Cmain.c · 28 줄
#include <stdio.h>#include <stdlib.h> /* 결과 세 개를 부른 쪽 변수의 주소로 받아서, 그 자리에 써 넣는다 */void stats(const int *a, int n, int *mn, int *mx, long long *sum) {    *mn = *mx = a[0];  /* 첫 칸으로 시작해야 모두 양수·모두 음수일 때도 맞다 */    *sum = 0;    for (int i = 0; i < n; i++) {        if (a[i] < *mn) *mn = a[i];        if (a[i] > *mx) *mx = a[i];        *sum += a[i];  /* 합은 long long: 10억 × 10만은 int를 넘는다 */    }} int main(void) {    int n;    scanf("%d", &n);    int *a = malloc(n * sizeof *a);    for (int i = 0; i < n; i++) scanf("%d", &a[i]);     int mn, mx;    long long sum;    stats(a, n, &mn, &mx, &sum);  /* 주소를 넘긴다 */    printf("%d %d %lld\n", mn, mx, sum);     free(a);    return 0;}