본문 바로가기
coding test

[프로그래머스/level2] 최댓값과 최솟값

by objet 2024. 1. 17.

 

문제

 

 

풀이과정

양수, 0, 음수 모두를 고려해서 최솟값과 최댓값을 찾아야 하는 문제이다.

고려해야 할 사항은 다음과 같다.

1. string으로 주어지는 문자열을 C++에서 어떻게 split할 것인가?

2. 최댓값/최소값을 어떻게 구별할 것인가?

3. 문자열과 숫자 간 변환을 어떻게 할 것인가?

 

C++에서 공백을 기준으로 문자를 나누는 방법은 크게 substr()을 사용하는 방법stream을 사용하는 방법이 있다.

필자는 stream을 사용하였다.

 

vector에서 최대/최솟값을 알아내는 방법은 max()와 min()함수를 사용하는 방법, sort()로 정렬해서 찾아내는 방법, max_element()와 min_element()를 사용하는 방법 등 매우 다양하다.

sort()로 정렬할 때에는 정렬된 vector의 양 끝 값을 가져오면 된다.

필자는 sort() 방법과 max_element(), min_element() 방법 모두 사용하여 효율성을 비교해보았다.

 

문자열과 숫자 간 변환 방법은 다음과 같다.

문자열->숫자: <cstdlib> 헤더의 atoi(), <string> 헤더의 stoi()

숫자->문자열: <string> 헤더의 to_string()

 

 

풀이 코드

#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <iostream>

using namespace std;

string solution(string s) {
    string answer = "";
    vector<int> numbers;
    
    stringstream ss(s);
    string word;
    while (getline(ss, word, ' '))
        numbers.push_back(stoi(word));
    
    // max_element()와 min_element()를 사용하는 방법
    int max = *max_element(numbers.begin(), numbers.end());
    int min = *min_element(numbers.begin(), numbers.end());
    answer = to_string(min) + " " + to_string(max);
    
    // sort()함수를 사용하는 방법
    //sort(numbers.begin(), numbers.end());
    //answer = to_string(numbers[0]) + " " + to_string(numbers[numbers.size() - 1]);
    
    return answer;
}

 

 

 

실행 결과

 

테스트를 돌려본 결과, max_element()와 min_element()를 사용하는 방법이 sort()를 사용하는 방법보다 시간적인 측면에서 좀 더 우위에 있었다.