본문 바로가기
코딩테스트 준비/프로그래머스

[프로그래머스][C++] 최댓값과 최솟값

by 스테디코디스트 2023. 10. 30.
반응형

<문제 소개>


<소스 코드>

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(string s) 
{
    string answer = "";
    
    vector<int> nums;
    
    for(int i = 0; i < s.size(); i++)
    {
        int addNum = 0;
        bool isMinus = false;
        
        while(s[i] != ' ' && i < s.size())
        {            
            int curNum = s[i] - '0';
            
            // 음수인 경우
            if(s[i] == '-')
            {
                isMinus = true;
                i++;
                continue;
            }
            
            addNum = addNum * 10 + curNum;
            i++;
        }        
        
        if(isMinus) addNum *= -1;
        
        nums.push_back(addNum);
    }
        
    sort(nums.begin(), nums.end());
    
    int max = nums[0];
    int min = nums[nums.size() - 1];
    
    answer += to_string(max);
    answer += ' ';
    answer += to_string(min);
    
    return answer;
}

<풀이과정>

1. 문자열의 숫자 중 최솟값과 최댓값을 찾아야 하므로 정렬이 필요하다.

2. 문자열을 먼저 숫자로 바꾸어 nums 벡터에 담고, 이후에 sort를 이용해 정렬을 하면 첫번째 원소가 최솟값, 마지막 원소가 최댓값이 되는 것을 이용했다.

3. 문자열을 숫자로 바꿀 때 음수인 경우가 있고, 십의자리 이상인 경우가 있다.

4. 따라서 내부에서 while문을 이용해 공백이 아니고, 문자열의 범위를 나가지 않는 범위에서 반복을 진행하며 숫자를 찾아서 저장한다.

5. 이때, 음수인 경우에는 bool 변수로 저장했다가 한 숫자의 문자들을 모두 찾아서 합한뒤 마지막에 -1을 곱해준다.

6. 위와 같은 방식으로 문자열 s에서 모든 숫자들을 구해 nums에 저장하고, 모든 숫자를 구한 뒤 정렬해준다.

7. answer에는 앞서 구한 최솟값과 최댓값을 to_string함수를 이용해 문자열로 바꿔서 중간에 공백과 함께 추가해주고 리턴한다.

 


<코멘트>

문제도 간단하고 쉬워보여서 이게 왜 2단계지 싶었는데 2단계인 이유가 있었다.ㅋㅋㅋ

쉽진 않았다.


<제출결과>