문제
주어진 N개의 숫자에서 차소값(두번째로 작은 값)과 차대값(두번째로 큰 값)과 차대값, 차소값의 합을 출력하라.
N은 5보다 크고 1000보다 작은 수이다.
주어지는 각 숫자는 1보다 크거나 같고, 2^32(2의 32승)보다 작은 값이다.
이때, 주어지는 숫자들은 모두 서로 다른(distinct)값이라고 가정해도 된다.
Input
첫 번째 줄에 입력값 N이 주어진다.
두 번째 줄에 N개의 숫자가 주어진다.
Output
주어진 N개의 숫자 중에서 차소값, 차대값, 차소값과 차대값의 합을 순서대로 출력한다.
Sample Input
15
2 3 5 8 12 1 7 10 13 30 6 14 15 18 22
Sample Output
2 22 24
이 문제의 포인트는 주어지는 숫자의 범위는 부호 없는 정수형의 범위 안에 있지만,
두 수의 합은 정수형의 범위를 벗어날 수 있다는 점이다.
따라 자료형의 선택이 중요하다.
<코드>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
int compare(const void* f, const void* s) {
long long x = *((long long*)f);
long long y = *((long long*)s);
if (x > y) return 1;
else if (x == y) return 0;
else return -1;
}
int main() {
long long n, m;
long long arr[MAX];
scanf_s("%lld", &n);
for (int i = 1; i <= n; i++) {
scanf_s("%lld", &m);
arr[i] = m;
}
qsort(arr, (n + 1), sizeof(long long), compare);
//배열이 0부터 시작이 아닌 1부터 시작으로 설정하였으므로 n+1을 인자로 전달한다.
long long secondMAX, secondMIN;
secondMIN = arr[2];
secondMAX = 0;
for (int i = 1; i <= n; i++) {
if (i == (n - 1))
secondMAX = arr[i];
}
long long sum = secondMIN + secondMAX;
printf("%lld %lld %lld", secondMIN, secondMAX, sum);
return 0;
}
C 표준 라이브러리에 있는 qsort() 함수를 활용하여 배열을 정렬하였다.
또, 두 수의 합이 정수형의 범위를 벗어날 수 있다는 점과, 주어지는 각 숫자가 2^32보다 작은 값이라는 점을 고려하여
long long 타입을 사용하였다.
<실행 결과>
'Algorithm > 알고리즘' 카테고리의 다른 글
[Python] set 연산 (0) | 2023.01.07 |
---|---|
[Python] 문자열에서 find 함수 (0) | 2023.01.01 |
[백준 1929번] set 정렬 (0) | 2022.11.27 |
[Python] DFS, BFS (0) | 2022.10.02 |
피보나치 수열의 항 구하기 (피사노 주기) (0) | 2021.03.26 |