1, 숫자 문자열과 영단어(https://school.programmers.co.kr/learn/courses/30/lessons/81301)
문제를 간단히 살펴보자면, 다음과 같다.
- one4seveneight = 1478
- 23four5six7 = 234567
- 1zerotwozero3 = 10203
이처럼 문자와 숫자가 섞인 문자열을 온전히 정수형 값으로 바꿔줘야 하는데, 먼저 숫자 문자열을 정수형으로 바꾸는 과정은 간단하다.
- 숫자 문자열을 정수형으로 바꿔주고 ( s[i] - '0' )
- 해당 정수형을 answer에 더한다.
- 자릿수를 위해 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);
}
'프로그래머스' 카테고리의 다른 글
24/08/05 - K번째수, 두 개 뽑아서 더하기, 가장 가까운 같은 글자(C++, JS) (0) | 2024.08.05 |
---|---|
24/08/02 - 문자열 내 마음대로 정렬하기(C++, JS) (0) | 2024.08.02 |
24/07/31 알고리즘 문제 (0) | 2024.07.31 |
24/07/30 알고리즘 문제 (0) | 2024.07.30 |
24/07/29 알고리즘 문제 (0) | 2024.07.29 |