2026. 6. 9. 11:36ㆍProgrammers
문제
공백으로 구분된 숫자들이 담긴 문자열 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()으로 정수를 문자열로 변환해 반환한다
'Programmers' 카테고리의 다른 글
| <프로그래머스 C++> 이진 변환 반복하기 풀이 (0) | 2026.06.11 |
|---|---|
| <프로그래머스 C++> Jaden Case 문자열 만들기 풀이( toupper(), tolower() ) (0) | 2026.06.10 |
| <프로그래머스 C++> 신고 결과 받기 풀이 (0) | 2026.06.08 |
| <프로그래머스 C++> 공원 산책 풀이 (0) | 2026.06.04 |
| <프로그래머스 C++> 개인정보 수집 유효기간 풀이 (0) | 2026.06.01 |