3번 최소, 최대

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

 

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

 

C++

vector를 사용해서 풀어본다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> vec(n);
    for (int i = 0; i < n; i++){
        cin >> vec[i];
    }
    vector<int>::iterator min_iter = min_element(vec.begin(), vec.end());
    vector<int>::iterator max_iter = max_element(vec.begin(), vec.end());
    cout << *min_iter << " " << *max_iter;
    return 0;
}

 

vector는 가변 배열이지만 사이즈를 특정해서 고정 크기로 사용할 수 있다.

algorithm을 사용해서 배열 안에서 min, max 요소를 찾아서 반복자를 반환받아서 값을 출력한다.

min, max_element 함수가 반복자를 반환하는 이유는 중복된 값을 저장할 필요 없이 컨테이너의 요소를 직접 참조할 수 있으며 컨테이너의 종류에 상관없이 유연하게 사용할 수 있기 때문이다. 또한 반복자에 접근해서 컨테이너의 요소를 직접 조작할 수도 있다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> vec;
    for (int i = 0; i < n; i++){
        int val;
        cin >> val;
        vec.push_back(val);
    }
    vector<int>::iterator min_iter = min_element(vec.begin(), vec.end());
    vector<int>::iterator max_iter = max_element(vec.begin(), vec.end());
    cout << *min_iter << " " << *max_iter;
    return 0;
}

 

가변적으로 사용할 때는 push_back을 사용하면 된다.

 

C#

using System;
using System.Collections.Generic;
using System.Linq;
class Program{
    static void Main(string[] args){
        int n = int.Parse(Console.ReadLine());
        string[] input_arr = Console.ReadLine().Split(' ');
        List<int> num_list = new List<int>();
        for (int i = 0; i < n; i++){
            num_list.Add(int.Parse(input_arr[i]));
        }
        int min = num_list.Min();
        int max = num_list.Max();
        Console.WriteLine($"{min} {max}");
    }
}

 

C#에서는 List <T>를 사용할 수 있다. List는 Collections.Generic에 포함되어 있고 Min, Max를 사용하기 위해서 Linq도 사용한다.

 

리스트에 값을 넣는 과정도 Select와 ToList를 사용하면 한 번에 초기화할 수 있다.

string[] input_arr = Console.ReadLine().Split(' ');
List<int> num_list = new List<int>();
for (int i = 0; i < n; i++){
    num_list.Add(int.Parse(input_arr[i]));
}

//================================================
List<int> numbers = Console.ReadLine().Split(' ').Select(int.Parse).ToList();

 

Linq는 이외에도 배열이나 컬렉션 등을 처리할 때 유용한 기능들을 제공하기 때문에 함께 사용하는 경우가 많다. 하지만 강력한 기능인만큼 많은 메모리를 사용하기 때문에 주의해야 한다.

 

Python

n = int(input())
num_list = list(map(int, input().split()))
min_val = min(num_list)
max_val = max(num_list)
print(f"{min_val} {max_val}")

 

파이썬은 list()를 사용할 수 있다.

map은 해당 함수가 반복 가능한 객체의 각 요소에 대해 적용된 결과를 반환하는 map객체를 생성하는데 이 객체는 필요에 따라 리스트나 튜플로 변환하여 사용할 수 있다.

map을 사용해서 입력되는 값을 공백으로 구분하고 각 문자열을 정수로 변환하여 반환되는 map으로 list를 초기화한다.

 

Node.js

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin','utf8').split('\n');
const n = parseInt(input[0]);
const nums = input[1].split(' ').map(Number);
let min_val = nums[0];
let max_val = nums[0];
for (int i = 1; i < n; i++){
    if (nums[i] < min_val)
        min_val = nums[i]
    else if (nums[i] > max_val)
        max_val = nums[i]
}
console.log(`${min_val} ${max_val}`);

 

js도 map을 사용해서 배열을 초기화시킬 수 있다. 입력받은 값을 Number함수로 각 요소를 숫자로 변환한 map을 반환한다.

 

최대 최소를 구하는 방법은 함수를 쓰지 않고 각 요소들의 크기를 작으면 min, 크면 max로 비교하여 구할 수 있다.

 

js에서도 최대 최솟값을 구하는 Math.min, Math.max를 지원한다.

 

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin','utf8').split('\n');
const n = parseInt(input[0]);
const nums = input[1].split(' ').map(Number);
const min_val = Math.min(...nums);
const max_val = Math.max(...nums);
console.log(`${min_val} ${max_val}`);

 

728x90
반응형

+ Recent posts