1. 문제
문제 설명
영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.
제한사항
- numbers는 소문자로만 구성되어 있습니다.
- numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
- 1 ≤ numbers의 길이 ≤ 50
- "zero"는 numbers의 맨 앞에 올 수 없습니다.
입출력 예
numbersresult"onetwothreefourfivesixseveneightnine" | 123456789 |
"onefourzerosixseven" | 14067 |
2. 코드
더보기
#include <string>
#include <vector>
#include <map>
using namespace std;
long long solution(string numbers) {
long long answer = 0;
map<string, int> m1;
m1 = {{"zero", 0}, {"one", 1}, {"two", 2}, {"three", 3}, {"four", 4}, {"five", 5}, {"six", 6}, {"seven", 7}, {"eight", 8}, {"nine", 9}};
string num = "";
for (char ch : numbers) {
num += ch;
// 반복자가 끝에 도달하지 않았으면
if (m1.find(num) != m1.end())
{
// 자리 수 변경하고 일의 자리에 숫자를 넣음
answer = answer * 10 + m1[num];
// num 다시 초기화
num = "";
}
}
return answer;
}
3. 분석
영단어의 조합으로 되어있는 numbers가 있다.
map<string, int>로 선언된 m1에 키-값 페어로 영단어와 숫자를 매치해준다.
이제 numbers의 각 알파벳을 순회한다.
string 형의 num은 알파벳이 모여 하나의 숫자 영단어가 되면 해당하는 키-값 페어를 찾아 값을 반환하게 한다.
map의 find 문법은 반복자를 반환하므로, 반복자가 끝에 도달할 때 까지 자리 수를 증가시키며 해당하는 값을 더해준다.
'코딩 테스트 연습' 카테고리의 다른 글
0-6. 직사각형 넓이 구하기 ( 이중벡터의 정렬 ) (0) | 2023.08.30 |
---|---|
0-5. 소인수 분해 (set 컨테이너) (1) | 2023.08.30 |
0-4. 무작위로 K개의 수 뽑기 ( 배열의 중복된 수 제거하기 ) (0) | 2023.08.24 |
0-3. Stringstream (0) | 2023.08.21 |
0-1. 분수의 덧셈 (0) | 2023.08.12 |