본문 바로가기

Algorithm/알고리즘

차대값과 차소값 찾기

문제

주어진 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