첫 줄에 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
오류 목록00F8 ↓ · ⇧F8 ↑
입력(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;}