본문 바로가기
프로그래머스

24/08/01 - 숫자 문자열과 영단어(C언어, js)

by Jini_Lamp 2024. 8. 1.

1,  숫자 문자열과 영단어(https://school.programmers.co.kr/learn/courses/30/lessons/81301)

 

문제를 간단히 살펴보자면, 다음과 같다.

  • one4seveneight = 1478
  • 23four5six7 = 234567
  • 1zerotwozero3 = 10203

이처럼 문자와 숫자가 섞인 문자열을 온전히 정수형 값으로 바꿔줘야 하는데, 먼저 숫자 문자열을 정수형으로 바꾸는 과정은 간단하다.

  1. 숫자 문자열을 정수형으로 바꿔주고 ( s[i] - '0' )
  2. 해당 정수형을 answer에 더한다.
  3. 자릿수를 위해 10을 곱한다. ( answer *= 10 )

코드는 다음과 같다.

if('0' <= s[i] && s[i] <= '9') // 숫자인지 확인
{
    answer *= 10;
    answer += s[i] - '0';
}

 

 

여기서 숫자 문자열을 정수형으로 바꾸기 위해 왜 '0'을 빼야하는지 간단히 설명해 보자면, 이 또한 아스키 코드와 연관이 있다.

 

숫자 0 ~ 9 까지의 아스키 코드는 48 ~ 49 이다.

즉, 1 = 49이고, 2 = 50 이다. 0 = 48이라고 했으니 문자열 '1'에서 '0'을 빼면 다음과 같다.

  • '1' = 49
  • '0' = 48
  • '1' - '0' = 49 - 48 => 1

 

숫자 문자형을 바꿔줬다면, 이제는 영단어이다.

 

내가 사용한 방법은 문자열 s와 숫자영어를 계속 비교하는 방법이다.

먼저 숫자영어를 살펴보면 앞에 두글자만 알아도 다른 단어들과 구분이 된다는 걸 알 수 있다. 한마디로 앞에 두 글자는 각 숫자영어의 유일점이라고 볼 수 있다. 숫자단어 내에서도, 하물며 단어끼리 연결 했을 때도 앞 두 글자는 나오지 않는다. 나는 이 점을 이용하여 코딩을 짰다.

char num[10][6] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

// 중략

for(int j=0; j<10; j++)	// 영어 단어 개수만큼 돌아가며
{
    if(s[i] == num[j][0] && s[i + 1] == num[j][1])	// 앞에 두글자가 일치하면 해당 숫자로 간주하고 계산한다.
    {
         answer *= 10;
         answer += j;
    }
}

 

최종 코드를 보면 다음과 같다.

// c언어
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(const char* s) {
    int answer = 0;
    char num[10][6] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    
    for(int i=0; i<strlen(s); i++)
    {
        if('0' <= s[i] && s[i] <= '9')
        {
            answer *= 10;
            answer += s[i] - '0';	// 숫자 문자열에서 '0'를 빼면 정수가 됨
        }
        else
        {
            for(int j=0; j<10; j++)
            {
                if(s[i] == num[j][0] && s[i + 1] == num[j][1])
                {
                    answer *= 10;
                    answer += j;
                }
            }
        }
    }
    
    return answer;
}

 

 

 

JS의 경우에는 다른 사람의 코드를 가져왔다. 아무리 생각해도 이보다 더 좋은 코드를 짤 수 없을 것 같다.

간단히 설명을 해보다면, split()를 통해 s의 문자열을 num의 기준으로 배열로 나눈다. 즉,  one4seveneight 를 예로 들자면 다음과 같다.

  • one4seveneight => [ '', '4seveneight' ]

 

그리고 join()을 통해 배열을 통합한다. join()의 재미있는 점은 괄호 안에 값을 넣으면 배열을 통합할 때 해당 값으로 연결된 채 통합이 된다는 점이다. 간단한 예제는 다음과 같다.

const arr = ['바람', '비', '물'];

console.log(arr.join());
// 바람,비,물

console.log(arr.join(''));
// 바람비물

console.log(arr.join('-'));
// 바람-비-물

 

그러니 여기서 괄호 안에 i를 넣어주면 i를 기준으로 배열이 통합된다. 그리고 여기서 i는 숫자영어와 동일한 값이다.

따라서 [ '', '4seveneight' ] 로 분리되었던 배열은 다시 14seveneight이 되는 것이다.

완전한 코드는 다음과 같다.

// js
function solution(s) {
    var answer = s;
    var num = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
    
    for(var i=0; i<num.length; i++){
        var arr = answer.split(num[i]);
        answer = arr.join(i);
    }
    
    return Number(answer);
}