티스토리 뷰

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

 

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

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

programmers.co.kr

#include <string>
#include <vector>
#include<iostream>

using namespace std;

vector<int> numbers = {448, 323, 346, 536, 444, 426, 340, 546, 529, 428};
int isNumber(int num){
    for(int i = 0; i < 10; i++){
        if(num == numbers[i]) {
            return i + 1; // 0 을 리턴하는 경우가 있다.
        }
    }
    return 0;
}

int solution(string s) {
    int findIndex;
    string answers = "";
    int checkAlpha = 0;
    for(int i = 0; i < s.length(); i++){
        if(s[i] >= 48 && s[i] <= 57) answers += s[i];
        else{
            if(s[i] == 110) {
                checkAlpha += (s[i] + 1);
                findIndex = isNumber(checkAlpha);
                if(findIndex){
                    answers += (findIndex + 47);
                    checkAlpha = 0;
                }
            }
            else{
                checkAlpha += s[i];
                findIndex = isNumber(checkAlpha);
                if(findIndex){
                    answers += (findIndex + 47);
                    checkAlpha = 0;
                }
            }
        }
    }
    int answer = stoi(answers);
    return answer;
}

문자열 벡터를 이용해도 상관없으나, 아스키코드 연산을 통해서도 풀 수 있지 않을까 생각했다. (매우 위험한 생각이었다) 문자열 "one" 부터 "nine" 까지 스트링을 더했을 때 나오는 숫자(합)를 통해 문자를 구별했다. 

five와 nine의 결과가 426으로 동일했기 때문에 n(110)이 입력되는 경우 +1 을 더해 (111)로 인식시켰다.

또한 "zero"의 경우 0 을 리턴해줘야하는데 false로 인식할 수 있어, i + 1을 리턴해주어야했다.

 

덧셈 중간에 결과가 겹치기라도 했다면 ex) z+e+r == n+i 와같이(그런 일은 없었지만) 위험한 풀이방법이었다. 결론 알고리즘 풀이에는 쉬운 길을 택하자.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함