[C++] 프로그래머스 문자열을 정수로 바꾸기
2020. 12. 3.
반응형

programmers.co.kr/learn/courses/30/lessons/12925

 

코딩테스트 연습 - 문자열을 정수로 바꾸기

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요. 제한 조건 s의 길이는 1 이상 5이하입니다. s의 맨앞에는 부호(+, -)가 올 수 있습니다. s는 부호와 숫자로만 이루어져있습니

programmers.co.kr

 

1. 서론

 

간단한 level 1문제. 그러나 여러 함수들을 잘 사용할 줄 알아야 슬기롭게 풀 수 있다.

 

2. 문제 풀이

 

문자열 s가 있다. 문자열 s를 숫자로 변환한 값을 return 하는 게 문제이다. 앞에는 +,- 부호가 붙는다. (+ 부호는 붙을 수도 안 붙을 수도 있는 것 같다) 음수이건 양수이건 양수로 표현하는 게 키포인트이다.

 

나는 처음에는 그냥 stoi함수를 이용해서 풀었다. stoi함수는 string to int로 말 그대로 문자열을 숫자로 변환하는 함수이다.
이걸 사용하면 단 한 줄로 문제를 끝낼 수 있다. 하지만 stoi 함수를 코테볼 때 못쓰게 하는 곳도 있기 때문에 stoi가 없는 버전도 만들었다.

그런데 stoi 함수를 그냥 구현해서는 이 문제를 풀 수 없다. 단순히 string to int가 아니라 +, - 부호가 붙기 때문에 그것에 대한 처리가 필요하기 때문이다.

 

처음에는 단순하게 +일때는 안 붙는 줄 알고 - 일 때만 처리를 해줬다. 실행 결과는 다 맞았으나 채점하려고 내보니까 틀린 테케들이 나와서 60점을 맞았다. 그래서 질문하기에 가보니 +가 있을 때도 있고 없을 때도 있다는 말을 듣고 +, - 부호 처리를 위해 isdigit 함수를 썼다.

isdigit 함수는 숫자인지 아닌지를 판단해주는 함수이다. 

 

3. 코드 설명

 

1) stoi를 쓴 경우

 

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
   return stoi(s);
}

 

2) stoi 구현

 

#include <string>
#include <vector>
#include <cctype>

using namespace std;

int calc(string s)
{
    int i, sum = 0, mul = 1;

    for (i = s.size() - 1; i >= 0; i--)
    {
        if (!isdigit(s[i])) break;
        sum += (s[i] - '0') * mul;
        mul *= 10;
    }
    
    if (s[0] == '-')
        sum *= -1;
    
    return sum;

}
int solution(string s) {
    return calc(s);
}

 

isdigit으로 +, - 부호가 있는지 없는지 판단하고 부호가 나오면 바로 중지!

부호는 어차피 맨 앞에만 있기 때문에 for문을 빠져나와도 문제가 없다.

그리고 부호가 껴서 문자열 처리되면 답이 달라지기 때문에 꼭 막아줘야 한다. 

후에 - 있으면 음수로 바꿔주기.

 

 

 

 

 

 

 

 

 

 

 

반응형
myoskin