알고리즘과 언어/문제풀이

프로그래머스) 최댓값과 최솟값 c++ 풀이

nextcoder 2022. 1. 4. 17:38

문제

https://programmers.co.kr/learn/courses/30/lessons/12939

 

코딩테스트 연습 - 최댓값과 최솟값

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요. 예를

programmers.co.kr

 

문자열로 주어진 숫자들 중에서 가장 작은 값과 가장 큰 값을 문자열로 묶어 반환하는 문제다.

 

내 풀이

문자열을 순차적으로 숫자로 반환한다.

순차적으로 탐색하며 MIN 값과 MAX값을 경신하는 방법으로 풀었다.

 

내 로직

1. 임의의 최솟값 (-99999999) 최댓값 (99999999)을 설정한다.

 

2. 문자열을 탐색한다.

 

3 - 1. 공백이라면, 음수 check 값을 초기화한다.

        앞까지의 연속된 문자로 얻어진 '숫자'를 토대로 최댓값과 최솟값을 갱신한다.

3 - 2. '-' 라면

        '-'가 나온다면 음수 check

3 - 2. 공백도 아니고 '-'도 아니라면

       앞선 값에 10을 곱하고, 1의 자리 수에 값을 추가한다. (음수라면 뺌으로써, 양수라면 더함으로써 추가한다.)

 

4. 마지막 숫자 뒤에는 ' '이 없기 때문에, 마지막에도 최댓값, 최솟값 갱신을 진행한다.

 

 

내 코드

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

string solution(string s) {
    
    string answer = "";
    bool MINUS = false;
    int MAX = -99999999;
    int MIN = 99999999;
    int num = 0;
    
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] == ' ')
        {
            MINUS = false;
            if (num < MIN)
                MIN = num;
            if (num > MAX)
                MAX = num;
            num = 0;
            continue;
        }
        else if (s[i] == '-')
        {
            MINUS = true;
            continue;
        }
        else
        {
                num *= 10;
                if(MINUS)
                    num -= (s[i] - '0');
                else
                    num += (s[i] - '0');
        }
        
    }
    if (num < MIN)
        MIN = num;
    if (num > MAX)
        MAX = num;
    
    answer += to_string(MIN);
    answer.push_back(' ');
    answer += to_string(MAX);

    return answer;
}

 

 

알게된 점

문자열은 대부분 python으로 풀어왔기 때문에, to_string 함수에 대해 알게 되었다.

다른 사람의 c++ 풀이에도 to_string은 쓰였다.

 

https://www.cplusplus.com/reference/string/to_string/

 

to_string - C++ Reference

function <string> std::to_string string to_string (int val); string to_string (long val); string to_string (long long val); string to_string (unsigned val); string to_string (unsigned long val); string to_string (unsigned long long val); string to_string (

www.cplusplus.com

모든 type의 숫자를 문자열로 바꾸어 string type으로 반환해준다.

 

 

 

다른 사람의 풀이

1. 문자열에서 숫자를 추출하여

2. 벡터에 넣은 후에

3. sort()를 통해 맨 앞과 맨 뒤의 숫자를 묶어 반환했다.

 

** 이 풀이의 경우 임의의 최솟값과 최댓값을 설정할 필요가 없기에 안전하다고 생각했지만 (최솟값, 최댓값을 int의 끝 범위로 설정해야 한다고 생각했지만 그렇게 구현하지 못했다.)

sort를 진행하는 것이 순차 탐색보다 시간 복잡도가 좋지 않다고 생각된다.