나도 고럭키를 따라서 카카오 기출문제들을 짚어보려 한다! 어차피 올솔과 같은 허망된 꿈은 꾸지 않기 때문에 비교적 쉽게 풀 수 있는 문제들을 정확하고 빠르게 푼 다음 아낀 시간을 중간 난이도의 두문제 정도에 투자해야할 것 같다!
이번 문제는 아주아주 간단한 문제이다. 2021 카카오 채용연계형 인턴십에서 출제되었고 아마도 1번이었겠지? 숫자 문자열과 영단어 문제이다!
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 | 영단어 |
---|---|
0 | zero |
1 | one |
2 | two |
3 | three |
4 | four |
5 | five |
6 | six |
7 | seven |
8 | eight |
9 | nine |
s | result |
---|---|
one4seveneight | 1478 |
23four5six7 | 234567 |
2three45sixseven | 234567 |
123 | 123 |
풀이랄 것도 사실 별로 없는 문제이다. 진짜 간단한 문제인데 왜 예전엔 헤맸던 것 같지..? ;; 푼 기억은 있는데 원활히 풀었던 느낌은 아니다,, 큼,,
문자열 s의 원소 s[i] 가 0-9 사이의 문자이면 문자열에 바로 추가하고, a-z 사이의 문자라면 한 단어를 찾을 때 까지 i를 늘려나가면서 숫자를 찾을 key 문자열에 추가한다.
<map>
을 이용해 key, value가 모두 string 인 맵 dictionary
를 사용하였고 찾은 key에 해당하는 value 가 있을 때까지 key 문자열을 완성해 문자열에 알맞은 숫자 문자열로 변환해서 변환된 문자열에 값을 추가한다.
최종적으로 문자열을 int 로 변환해 반환하면 된다!
#include <iostream>
#include <string>
#include <map>
using namespace std;
string strNum[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int solution(string s) {
map<string, string> dictionary;
for (int i = 0; i <= 9 ; ++i) {
dictionary[strNum[i]] = to_string(i);
}
string changed = "";
for (int i = 0; i < s.size(); ++i) {
if (s[i] >= '0' && s[i] <= '9'){
changed += s[i];
}else{
string key = "";
key += s[i];
int j = i+1;
while ( j<s.size() && dictionary.count(key) == 0){
key += s[j++];
}
changed += dictionary[key];
i = j-1;
}
}
return stoi(changed);
}