프로그래머스) 최댓값과 최솟값 c++ 풀이
문제
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를 진행하는 것이 순차 탐색보다 시간 복잡도가 좋지 않다고 생각된다.