2026. 4. 21. 10:51ㆍProgrammers


문제 해석
1. 숫자인 경우 -> 그대로 결과에 추가
2. 알파벳인 경우 -> 영단어가 시작되는 지점이므로 어떤 단어인지 찾아서 숫자로 변환
각 숫자에 맞는 영단어를 벡터로 저장해서 인덱스 = 숫자 라는 대응관계를 만들어 해결했다.
문제 풀이
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
string answer1 = "";
vector<string> words= {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i=0; i<s.size(); ++i)
{
if(isdigit(s[i]))
{
answer1 += s[i];
continue;
}
for(int j=0; j<words.size(); ++j)
{
if(s.substr(i, words[j].size()) == words[j])
{
answer1 += to_string(j);
i += words[j].size() -1;
break;
}
}
}
answer = stoi(answer1);
return answer;
}
핵심 포인트
1. isdigit()로 숫자 판별
isdigit()는 문자가 0~9 사이면 true를 반환하는 함수이다.
이 함수를 통해 숫자면 그대로 결과에 이어 붙이고 continue;로 다음 문자로 넘어가도록 한다.
2. substr로 영단어 비교
s.substr(i, words[j].size()) == words[j]
현재 위치인 i부터 영단어 길이만큼 잘라서 비교한다.
one4seveneight 일 때, i = 0이면 words[1]과 비교하면 일치한다.
3. 인덱스를 숫자로 활용
answer1 += to_string(j);
words[j]를 찾아서 j 자체를 string에 추가하는 방식이다.
4. 인덱스 건너뛰기
i += words[j].size() - 1;
one을 찾았다고 가정하면, O, n , e 세 글자를 건너뛰어야 하므로 i를 3만큼 증가시켜야 한다.
하지만 for문에서 i를 ++i로 1만큼 증가시키므로 직접 -1을 해주어야 원하는 값만큼 증가시킬 수 있다.
트러블 슈팅 - substr()의 범위 이해
substr(i, words[j].size()) 에서 i + size()가 문자열의 길이를 넘으면 오류가 나지 않을까 걱정했다.
예를 들어 " 123 " 에서 마지막 문자 ' 3 ' 위치인 인덱스 2에서 "seven"(길이 5) 을 비교하려 하면 substr(2, 5)는 문자열의 길이를 벗어나는 것 처럼 보인다.
해결 방법
C++의 substr은 두 번째 인자가 남은 문자열 길이보다 커도 에러를 내지 않는다.
남은 만큼만 잘라서 반환해준다.
string s = "123";
s.substr(2, 5);
즉, "123"의 i = 2에서 substr(2, 5)를 호출하면 "3"이 반환되고, 이건 "seven"과 당연히 다르므로 false가 되어 넘어간다.
따라서 길이 초과를 따로 체크할 필요가 없다. 이미 isdigit로 숫자를 미리 걸러낸 상태이기 때문에 알파벳 위치에서 substr비교는 항상 안전하게 동작한다.
'Programmers' 카테고리의 다른 글
| < 프로그래머스 C++ > K번째 수 (0) | 2026.04.23 |
|---|---|
| < 프로그래머스 C++ > 문자열 내 마음대로 정렬하기 (0) | 2026.04.22 |
| < 프로그래머스 C++ > 시저 암호 (0) | 2026.04.20 |
| < 프로그래머스 > 최소직사각형 (0) | 2026.04.17 |
| 백준 <주사위 세 개> (C++ 랜덤함수) (0) | 2026.04.03 |