문제 URL:
10818번: 최소, 최대
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
www.acmicpc.net
이 문제는 배열의 최솟값과 최댓값을 찾아내어 출력하는 문제이다.
처음에 이 문제를 풀 때 for 반복문을 중첩하여 배열의 처음부터 끝까지 정렬시켰다.
하지만 그렇게 코드를 짜면 실행시간이 너무 오래 걸리고,
실제로 필요한 값은 최댓값과 최솟값뿐이기 때문에 비효율적이었다.
따라서 다시 방법을 생각해냈는데, 방법은 다음과 같다.
먼저, 반복문을 통해 배열의 첫 번째 값과 뒤 따라오는 값들을 비교하여 가장 작은 값을 배열의 맨 앞으로 가져오고,
반복문을 한 번 더 사용하여 배열의 두 번째 값과 뒤 따라오는 값들을 비교한 뒤 가장 큰 값을 배열의 두번째 자리로 가져왔다.
이 과정을 거치면 배열의 첫 번째와 두 번째 자리에 각각 최솟값과 최댓값이 들어가게 되므로
배열의 첫 번째 자리 수와 두 번째 자리 수를 출력하여 결과를 구하였다.
여기서 n=1일 때는 예외 사항으로 생각해주어야 하는데,
다른 숫자들과 달리 n이 1인 경우에는 최솟값과 최댓값이 같기 때문이다.
이와 같은 방법을 생각해냈지만 문제를 풀면서 예외가 생기고, 숫자의 가독성이 떨어진다는 느낌을 받아
위와 같은 방식 역시 문제를 풀기에 비효율적이라는 생각이 들었다.
따라서 이 문제는 더 고민해볼 필요가 있을 것 같다.
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int* list = new int[n];
int temp = 0;
for (int i = 0; i < n; i++)
cin >> list[i];
for (int i = 0; i < n - 1; i++)
{
if (list[0] > list[i + 1])
{
temp = list[0];
list[0] = list[i + 1];
list[i + 1] = temp;
}
}
for (int i = 0; i < n - 1; i++)
{
if (list[1] < list[i + 1])
{
temp = list[1];
list[1] = list[i + 1];
list[i + 1] = temp;
}
}
if (n == 1)
cout << list[0] << " " << list[0] << endl;
else
cout << list[0] << " " << list[1] << endl;
}