코딩테스트
[프로그래머스] 숫자 문자열과 영단어
코딩너구리
2024. 5. 22. 17:40
https://school.programmers.co.kr/learn/courses/30/lessons/81301
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"234567 → "23four5six7"10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ s의 길이 ≤ 50s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
영어를 숫자로 치환해야 하는 문제이다. 처음에는 char 배열에 전부 담아서 검사를 할까 했지만 string에 replace 함수를 이용해 풀어보기로 했다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(string s) {
int answer = 0;
string numbers[] ={"zero","one","two","three","four","five","six","seven","eight","nine"};
int size = sizeof(numbers) / sizeof(numbers[0]);
for(int i = 0; i < size;i++)
{
while(s.find(numbers[i])!=string::npos)
{
s.replace(s.find(numbers[i]),numbers[i].length(),to_string(i));
}
}
answer = stoi(s);
return answer;
}
for(int i = 0; i < size;i++)
{
while(s.find(numbers[i])!=string::npos)
{
s.replace(s.find(numbers[i]),numbers[i].length(),to_string(i));
}
}
핵심적인 부분은 이 곳인데, 문자열 안에 같은 영문자가 여러개 있을 경우 while을 통해 게속 찾지 않으면 가장 앞에 있는 값만 변경되기 때문에 string::npos를 이용해 쓰레기 값이 라면 더이상 영문자가 존재하지 않는다고 판단할때까지 루프를 돌려준다.