본문 바로가기
프로그래머스 코딩테스트 문제/Level 2

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

by jyppro 2024. 11. 19.

최댓값과 최솟값

안녕하십니까 정말 오랜만에 프로그래머스 코딩테스트 문제로 다시 찾아뵙게 되었습니다. 확인해보니 작년 9월말 즈음에 올린 신고 결과 받기가 마지막이었습니다. 1년하고도 2개월 정도 지나고 나서야 다시 찾아오게 되었네요

 

[프로그래머스] - 신고 결과 받기(C#)

신고 결과 받기 오늘은 프로그래머스 코딩테스트 레벨1에 정답률 순으로 정렬한 문제 중 마지막 문제인 2022 KAKAO BLIND RECRUITMENT "신고 결과 받기" 문제를 풀어보도록 하겠습니다. 이 문제의 정답률

jypgamepro.tistory.com

 

이번에는 다시 찾아온 만큼, 이전보다 더 발전한 형태로 글을 작성해 보려고 합니다. 글을 작성하는 포멧은 유지하며, 이전과 마찬가지로 정답률이 높은 순서부터 차례대로 글을 작성할 예정입니다. 하지만, 이번에는 C++로 소스코드를 작성해보려고 합니다. 그리고 아시다시피 레벨1을 마무리했으므로, 레벨 2부터 시작해보려고 합니다.

 

인사는 이정도로 마무리하고, 바로 본론으로 들어가보도록 하겠습니다. 프로그래머스 레벨2에서 처음으로 다룰 문제는 최댓값과 최솟값입니다. 이 문제는 현재 기준으로 정답률 80%입니다.

 

문제 설명

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

 

제한사항

  •  s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

 

입출력 예

s return
"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 1" "-1 -1"

 

시작 코드

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
    return answer;
}

 

나의 풀이

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

using namespace std;

string solution(string s) {
    string answer = "", tmp = "";
    vector<int> v;
    
    for(int i = 0; i < s.size(); ++i) {
        if(s[i] == ' ') {
            v.push_back(stoi(tmp));
            tmp = "";
        }
        else tmp += s[i];
    }
    v.push_back(stoi(tmp));
    
    answer += to_string(*min_element(v.begin(), v.end()));
    answer += ' ';
    answer += to_string(*max_element(v.begin(), v.end()));
    return answer;
}

 

코드 분석

C++로 소개하는 것은 처음이기 때문에 간단하게 짚고 넘어가자면, #include를 통해서 헤더파일을 사용할 수 있습니다. 지금은 algorithm을 가져온 모습입니다. 그리고 using문을 사용하여 std 네임스페이스를 선언하여 번거롭게 각 내장함수 앞에 std를 붙여 쓰지 않도록 하는 것입니다. std가 없으면, std::string 처럼 작성해야 합니다.

 

저희가 작성해야 하는 함수 solution은 string타입으로, string타입의 매개변수 s를 가지고 있습니다. 마찬가지로 정답도 string타입으로 반환해야 합니다. tmp를 추가로 선언하였고, int타입의 vector v를 추가로 선언하였습니다. 앞으로는 이와 같은 선언에 대한 언급은 하지 않도록 하겠습니다.

 

반복문으로 0부터 주어진 s의 사이즈만큼 돌리고, 그 안에서 if문을 통해 s를 순회하며 공백체크를 해줍니다. 만약 공백이라면, tmp에 저장된 숫자를 stoi를 통해 정수로 변환하여 벡터 v에 push_back으로 추가한 후, tmp를 초기화 합니다. 공백이 아니면 tmp에 현재 문자를 넣어줍니다. 반복문이 끝나면 벡터 v에 tmp를 넣어줍니다. 

 

answer에 최소값을 찾는 함수 min_element를 벡터 v의 처음부터 끝까지에 사용하여 최소값을 찾아내고, to_string으로 해당 숫자를 문자열로 변환합니다. 중간에 공백을 추가하고 같은 방식으로 max_element를 사용해 최대값을 찾아 넣어준다음 정답을 리턴합니다.

 

풀이 설명

일단 문제는 매우 짧고, 원하는 바도 정확합니다. 주어진 문자열 s에서 최솟값과 최댓값을 찾아 정해진 포맷대로 리턴하라는 것입니다. 중간중간에 사용된 함수는 stoi는 문자열을 정수로 변환한다는 뜻의 함수로 string to int라고 생각하시면 됩니다. push_back은 벡터의 맨 뒤에 값을 추가하는 것입니다.

 

min_element와 max_element는 알고리즘에서 가져온 함수로, 정확히는 위에서 벡터 v의 최솟/최댓값을 가리키는 반복자를 반환하는데, 앞에 *를 붙여서 반복자가 가리키는 값을 참조하도록 하였습니다.

 

소스코드의 진행방식은 단순합니다. 반복문을 통해 숫자로 표현된 문자열 s를 순회하여 공백이면 tmp값을 숫자로 만들어 v에 넣고, 아니면 tmp에 해당 s를 넣습니다. 이후 반복문이 끝나 마지막으로 가리키는 값도 v에 넣어주고, v를 검사해서 최솟값/최댓값을 찾아 answer에 넣어 반환하는 것입니다. tmp는 옮겨주기 위한 임시 저장값으로 사용되는 것입니다.

 

입출력 예의 첫번째로 예시를 들면, s로 "1 2 3 4"가 들어왔을 때 반복문을 돌리면 처음에 1을 만나 tmp에 넣고, 다음엔 공백을 만나 tmp에 들어간 1을 v에 넣어줍니다. 이 과정을 끝까지 반복하고 반복문이 끝난 후 마지막 값인 4도 v에 넣어줍니다. 그럼 v는 1, 2, 3, 4가 들어가게 됩니다. 이후 함수를 사용하여 최솟값(1)과 최댓값(4)를 찾아 answer에 공백과 함께 순서대로 넣어주면 "1 4"가 완성됩니다.

 

<NEXT>

이렇게 다시 돌아온 첫 프로그래머스 레벨2 문제 최댓값과 최솟값을 알아봤습니다. 오늘은 C++을 처음 소개하기 때문에 배경지식을 설명하느라 좀 길어졌지만, 다음부터는 특별한 함수나 새로 등장하는 것에 대해서만 이야기하고 넘어가도록 하겠습니다. 다음에는 <스택/큐> 문제인 "올바른 괄호" 문제를 들고 찾아올 예정입니다. 감사합니다.