<프로그래머스 C++> 최댓값과 최솟값 풀이(stringstream, climits)

2026. 6. 9. 11:36Programmers

문제

공백으로 구분된 숫자들이 담긴 문자열 s에서 최솟값과 최댓값을 찾아 "최솟값 최댓값"형태로 return하는 문제이다.


풀이 아이디어

문자열을 공백 기준으로 분리해 숫자로 변환한 뒤 최솟값과 최댓값을 구하면 된다.

 

  • 공백 기준 파싱
    • stringstream을 사용하면 공백 기준으로 문자열을 자동으로 분리할 수 있다.
  • 최솟값 / 최댓값 초기값
    • 최솟값 탐색 시 초기값을 너무 작게 잡으면 실제 최솟값을 못잡는다. INT_MAX / INT_MIN 으로 초기화하면 어떤 숫자가 들어와도 올바르개 갱신할 수 있다.

stringstream이란?

문제에서 stringstream을 사용했는데, C++에서는 파이썬의 split()같은 함수가 없기 때문에 공백 기준으로 문자열을 나눌 때 자주 쓰이는 방법이다.

 

<sstream> 헤더에 정의되어 있으며 문자열을 입출력 스트림처럼 다룰 수 있게 해준다.

stringstream ss("1 2 3 4");
string token;

while(ss >> token)
{
    cout << token << "\n";
}
// 출력: 1, 2, 3, 4

 

">>" 연산자가 공백을 구분자로 토큰을 하나씩 꺼낸다. 더 꺼낼 게 없으면 스트림 상태가 false가 되어 while이 자동으로 종료된다.

 

string대신 int로 받으면 stoi()없이 바로 정수로 추출할 수도 있다.

stringstream ss("1 2 3 4");
int num;
while(ss >> num)
{
    cout << num << "\n";
}

climits 란?

INT_MAX, INT_MIN은 <climits> 헤더에 정의된 상수이다.

각 정수형이 표현할 수 있는 최솟값 / 최댓값을 담고 있다.

상수 의미
INT_MAX 2,147,483,647 int 최댓값
INT_MIN -2,147,483,648 int 최솟값
LLONG_MAX 9,223,372,036,854,775,807 long long 최댓값
LLONG_MIN -9,223,372,036,854,775,808 long long 최솟값

 

최솟값 탐색 시 초기값을 0으로 잡으면 입력이 모두 양수일 때 문제가 생긴다.

int minval = 0;
// 입력이 [3, 5, 7]이면 min(0, 3) = 0 → 틀림

 

이전에 바탕화면 정리 문제에서 이러한 방식을 해결한 경험이 있다.

https://tjdgus123.tistory.com/83

 

<프로그래머스 C++> 바탕화면 정리 풀이

문제바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어진다. #은 파일이 있는것. '.'은 파일이 없는 빈칸이다. 모든 파일을 한 번의 드래그로 선택할 수 있는 최소 이동거리의 시작점과 끝점

tjdgus123.tistory.com

 

int minval = INT_MAX;
// min(INT_MAX, 3) = 3 
// min(3, 5) = 3

INT_MAX로 초기화하면 어떤 숫자가 들어와도 min(INT_MAX, num) = num이 되어 항상 올바르게 갱신된다.


문제풀이

#include <string>
#include <vector>
#include <sstream>
#include <climits>
using namespace std;

string solution(string s) {
    int minval = INT_MAX;
    int maxval = INT_MIN;

    stringstream ss(s);
    string token;

    while(ss >> token)
    {
        int num = stoi(token);
        minval = min(minval, num);
        maxval = max(maxval, num);
    }
    return to_string(minval) + " " + to_string(maxval);
}

코드 흐름

1. 초기값 설정

int minval = INT_MAX;
int maxval = INT_MIN;

INT_MAX / INT_MIN으로 초기화해 어떤 입력에도 올바르게 갱신되도록 한다.

 

2. stringstream 으로 파싱

stringstream ss(s);
string token;

while(ss >> token)
{
    int num = stoi(token);
}

공백 기준으로 토큰을 하나씩 꺼내 stoi()로 정수로 변환한다.

 

3. 최솟값 / 최댓값 갱신

minval = min(minval, num);
maxval = max(maxval, num);

매 숫자마다 현재 값과 비교해 갱신한다.

 

4. 결과 반환

return to_string(minval) + " " + to_string(maxval);

to_string()으로 정수를 문자열로 변환하고 공백을 연결해 정답 형식에 맞게 반환한다.


핵심 포인트

 

  • stringstream으로 공백 기준 파싱을 간단하게 처리한다
  • 최솟값/최댓값 초기값은 INT_MAX/INT_MIN으로 설정해야 모든 입력에 대해 올바르게 동작한다
  • to_string()으로 정수를 문자열로 변환해 반환한다