Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[프로그래머스] 숫자 문자열과 영단어(2021 카카오 인턴십 기출) 본문

Problem Solving

[프로그래머스] 숫자 문자열과 영단어(2021 카카오 인턴십 기출)

흑개 2021. 7. 15. 22:12

https://programmers.co.kr/learn/courses/30/lessons/81301

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
 
vector<string> three_letters={"one","two","six"};
vector<string> four_letters={"zero","four","five","nine"};
vector<string> five_letters={"three","seven","eight"};
map<string, string> m={{"zero","0"}, {"one","1"},{"two","2"},{"three","3"},{"four","4"},
                      {"five","5"},{"six","6"},{"seven","7"},{"eight","8"},{"nine","9"}};
 
int solution(string s) {
    int answer = 0;
    string num="";
    vector<string>::iterator it;
    int i=0;
    while (i<s.length()){
        if ('0'<=s[i] and s[i]<='9'){
            num+=s[i];
            i++;
        }
        else{
            it=find(three_letters.begin(), three_letters.end(), s.substr(i,3));
            if (it!=three_letters.end()){
                num+=m[*it];
                i+=3;
                continue;
            }
            it=find(four_letters.begin(), four_letters.end(), s.substr(i,4));
            if (it!=four_letters.end()){
                num+=m[*it];
                i+=4;
                continue;
            }
            it=find(five_letters.begin(), five_letters.end(), s.substr(i,5));
            if (it!=three_letters.end()){
                num+=m[*it];
                i+=5;
                continue;
            }
        }
    }
    answer=stoi(num);
    return answer;
}
cs

조금 난잡?스럽게 푼 문제.

숫자이면=>읽어서 string에 저장

숫자가 아니면=>문자열 3개 쭉 읽으면서 3글자 목록에서 찾음

없으면 4개 쭉 읽으면서 4글자 목록에서, 없으면 5개 쭉 읽으면서 5글자 목록에서(substr 이용, 일치하는게 있으면 인덱스를 그만큼 늘려주는 형태)

근데 이렇게 복잡하게 할 필요 없었다

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
char extract(string s, string::iterator& iter)
{
    switch(*iter)
    {
        case 'z':
            {
                iter += 4;
                return '0';
            }
        case 'o':
            {
                iter += 3;
                return '1';
            }
        case 't':
            {
                iter++;
                if(*iter == 'w')
                {
                    iter += 2;
                    return '2';
                }
                else
                {
                    iter += 4;
                    return '3';
                }
            }
        case 'f':
            {
                iter++;
                if(*iter == 'o')
                {
                    iter += 3;
                    return '4';
                }
                else
                {
                    iter += 3;
                    return '5';
                }
            }
        case 's':
            {
                iter++;
                if(*iter == 'i')
                {
                    iter += 2;
                    return '6';
                }
                else
                {
                    iter += 4;
                    return '7';
                }
            }
        case 'e':
            {
                iter += 5;
                return '8';
            }
        case 'n':
            {
                iter += 4;
                return '9';
            }
        default:
            {
                char c = *iter;
                iter++;
                return c;
            }
    }
}
 
int solution(string s) {
    string numList;
    string::iterator iter = s.begin();
    while(iter != s.end())
        numList += extract(s, iter);
 
    int answer = stoi(numList);
    return answer;
}
cs

출처: 프로그래머스 sinsin63님 풀이

 

string iterator를 생성해서, 한글자씩 읽는다

숫자이면=> 그 숫자문자 저장 & iterator 늘려줌

문자이면=>첫글자가 다 z,o,t,f,s,e,n 으로 시작하니까 그걸 이용하는거다!!

t면 two도 있고 three도 있으니까 그 다음 iterator가 w이면 2를 리턴해주고 iterator를 2 증가시키고..

이런 방식으로!!!!

 

1. 첫글자 시작하는 걸로 case 분류해주었다

2. string iterator 을 만들어서 한글자씩 읽으면서, 맞는 숫자 문자열의 길이에 따라 iterator를 증가시키고 그걸 계속해서 호출하는 방식이다

 

'Problem Solving' 카테고리의 다른 글

[BOJ 1927] 최소 힙(C++)  (0) 2021.07.22
[BOJ 3055] 탈출 (C++)  (0) 2021.07.20
[프로그래머스] 단어 변환(DFS/BFS)  (0) 2021.07.15
[여름방학 프로젝트] ZeroBall(공구)  (0) 2021.07.13
[이약저약] 초안  (0) 2021.03.23