문제 설명
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
제한 조건
s의 길이는 1 이상 5이하입니다.
s의 맨앞에는 부호(+, -)가 올 수 있습니다.
s는 부호와 숫자로만 이루어져있습니다.
s는 "0"으로 시작하지 않습니다.
입출력 예
예를들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.
// 기본 코드
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
return answer;
}
처음에는 숫자를 문자열로 바꾸려면 to_string() 함수를 사용하면 쉽게 바뀌는데 반대로 문자열을 정수로 바꾸는 함수는 없나? 찾아보니 stoi() 함수로 간단하게 부호까지 포함하여 숫자로 변환해주는 함수가 있었지만 문제에서 요구하는 것은 간단한 함수를 사용하는게 아닌 직접 바꾸는 것을 요구하는 것 같아서 직접 바꿔보았다.
코드를 작성하기 전에 10분정도 생각을 해봤는데 어떻게 시작해야할지 아예 생각이 안나서 gpt에게 아래와 같은 아주 간단한 힌트만 받았다.
1. 문자열은 배열로 선언하지 않아도 배열처럼 이루어져 있다는것. - 아마 강의에서 들은것 같은데 기억이 안났다.
2. 문자형에 아스키코드 '0' = 48을 빼면 정수형 숫자가 된다는것. - 이건 아예 몰랐던 사실이다.
힌트를 받고 string s를 인덱스 0부터 4까지(제한 조건에 s의 길이는 1 이상 5이하) 가져와서 그 값에 - '0'을 하면 정수형 숫자가 되겠구나 생각했다.
그럼 이제 남은건 정수형 숫자로 바꾼 후 이 값을 각 자리에 맞게(최소 1의 자리에서 최대 10000의 자리까지) 넣어주는 것인데 처음에 생각한 것은 pow(제곱 함수)를 사용하여 10을 s.size()값을 조절하여 각 자리에 값을 넣어주려 했다.
#include <string>
#include <vector>
using namespace std;
int solution(string s)
{
int answer = 0;
int a = 10;
int num = 0;
//우선 부호를 제외한 숫자만 구하도록 구현해봄.
for(int i = 1; i < s.size() ; ++i)
{
num = (s[i] - '0') * pow(a, s.size()-(i+1));
answer += num;
}
return answer;
}
위와 같이 구현을 했는데 pow를 쓰는것 보다 곱셈누적방식을 사용하여 구현하는 것이 더 깔끔할 것 같아서 수정을 했다.
#include <string>
#include <vector>
using namespace std;
int solution(string s)
{
int answer = 0;
int sign = 0;
if(s[0] == '-') // 음수부분 구현
{
sign = -1;
for(int i = 1; i < s.size() ; ++i)
{
num = num * 10 + (s[i] - '0'); // 곱셈누적방식 사용
}
answer += num * sign;
}
else // 양수부분은 아직 미구현
{
sign = 1;
}
return answer;
}
곱셈누적방식을 사용하면서 마이너스 일때 라는 조건을 추가하여 음수 부분을 구현해봤다.
이제 양수 부분을 구현해야하는데 양수 부분은 앞이 부호 '+'가 올 수도, 바로 숫자가 올 수도 있는 상황이라 if - else if - else문을 사용하고 sign이 굳이 필요없는것 같아서 없앴다.
#include <string>
#include <vector>
using namespace std;
int solution(string s)
{
int answer = 0;
int num = 0;
if(s[0] == '-') // 첫 문자가 -
{
for(int i = 1 ; i < s.size() ; ++i) // 두번째 문자부터 시작
{
num = num * 10 + (s[i] - '0'); // 문자형 숫자에 '0' = 48을 빼면 정수형 숫자가 됨.
}
answer = num * -1;
}
else if(s[0] == '+') // 첫 문자가 +
{
for(int i = 1 ; i <s.size() ; ++i)
{
num = num * 10 + (s[i] - '0');
}
answer = num;
}
else // 첫 문자가 숫자
{
for(int i = 0 ; i < s.size() ; ++i) // 첫번째 문자부터 시작
{
num = num * 10 + (s[i] - '0');
}
answer = num;
}
return answer;
}
위처럼 작성하니 코드가 정상적으로 잘 작동했다.
'코딩 연습' 카테고리의 다른 글
프로그래머스(문자열 다루기 기본) (0) | 2025.09.04 |
---|---|
프로그래머(약수의 개수와 덧셈) (0) | 2025.09.03 |
프로그래머스(콜라츠 추측) (1) | 2025.08.28 |
프로그래머스(정수 제곱근 판별) (2) | 2025.08.26 |