알고리즘/프로그래머스 1단계

프로그래머스 - 영어가 싫어요 - C++

게임만드는학생 2023. 8. 31. 15:26

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 으로 바꿔서 리턴해준다.