프로그래머스 - 영어가 싫어요 - C++
https://school.programmers.co.kr/learn/courses/30/lessons/120894
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <string>
#include <vector>
#include <map>
using namespace std;
long long solution(string numbers) {
long long answer = 0;
string a = "";
int size[10] = { 4,3,3,5,4,4,3,5,5,4 };
int num[10] = { 0,1,2,3,4,5,6,7,8,9 };
map<string, int> m;
m.insert({ "ze",0 });
m.insert({ "on",1 });
m.insert({ "tw",2 });
m.insert({ "th",3 });
m.insert({ "fo",4 });
m.insert({ "fi",5 });
m.insert({ "si",6 });
m.insert({ "se",7 });
m.insert({ "ei",8 });
m.insert({ "ni",9 });
int cnt = 0;
int len = numbers.length();
while (cnt < len)
{
string b = "";
b += numbers[cnt];
b += numbers[cnt + 1];
int id = m[b];
cnt += size[id];
a += num[id] + '0';
}
return stoull(a);
}
설명
문자열에 있는 순서대로 알파벳을 보고 숫자로 바꾸는 문제이다.
one, two, three, four, five, six, seven, eight, nine
이 알파벳들은 앞의 두 글자를 통해서 전부 구분이 가능하다.
이 사실을 이용해서 문제를 해결했다.
map 자료구조를 통해서 키 = 알파벳, 값 = id 로 저장하였다.
ex) {"one",1}
이 id 는 size, num 배열에 활용된다.
size에는 각 알파벳의 길이가 들어있고 num 에는 각 알파벳이 뜻하는 숫자가 들어있다.
따라서 id == 1 이면 길이가 3이고 1을 뜻한다는 것을 알 수 있도록 자료구조를 만들었다.
그리고 while문을 돌며 cnt를 통해 알파벳을 읽기 시작한다.
string b = "";
b += numbers[cnt];
b += numbers[cnt + 1];
while 문 안의 이 코드는 알파벳의 첫 두글자를 만드는 것이다.
그리고 만든 이 문자열로 map에서 검색하여 id를 추출한다.
int id = m[b];
cnt += size[id];
a += num[id] + '0';
그리고 cnt를 알파벳의 길이만큼 증가시킨다.
ex) map["on"] 은 1이다. 따라서 id = 1 이 된다.
size[1] = 3 이기 때문에 cnt = 3 이 된다.
numbers = "onetwo" 라고 했을 때, cnt = 0 에서 3을 더해야 t를 가리키게 된다.
그리고 a에 num[id] 즉, 1을 문자로 넣어주기 위해 '0' 을 더한다.
마지막에 stoull 함수를 통해 문자열을 unsigned long long 으로 바꿔서 리턴해준다.