[프로그래머스 LV1] 숫자 문자열과 영단어
https://school.programmers.co.kr/learn/courses/30/lessons/81301
문제 설명
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 1478 → "one4seveneight"
- 234567 → "23four5six7"
- 10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자영단어
zero |
one |
two |
three |
four |
five |
six |
seven |
eight |
nine |
제한사항
- 1 ≤ s의 길이 ≤ 50
- s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
- return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
입출력 예
sresult
"one4seveneight" | 1478 |
"23four5six7" | 234567 |
"2three45sixseven" | 234567 |
"123" | 123 |
시도한 방법
- 영단어 -> 숫자 치환이 포인트라 생각하여, 쉽게 치환하기 위해 Map 객체를 만들었습니다.
- 문자열에서 영단어를 정규식을 사용하여 찾고자 했습니다.
function solution(s) {
var numMap = new Map([
["zero", "0"], ["one", "1"], ["two", "2"], ["three", "3"], ["four", "4"],
["five", "5"], ["six", "6"], ["seven", "7"], ["eight", "8"], ["nine", "9"]
]);
numMap.forEach((value, key) => {
// 전역 검색을 사용하여 전체 문자열에서 해당 영단어를 숫자로 치환
s = s.replace(new RegExp(key, "g"), value);
});
return parseInt(s);
}
좋은 풀이
이 문제를 split과 join으로 해결한 걸 보고 정말 예술적이다 싶어서 기록..
💡 split과 join의 활용
split
문자열을 특정 구분자(delimiter)에 따라 분할하여 배열로 반환한다.
`let example = "one4seveneight".split("one");`을 실행하면, "one"을 구분자로 사용하여 문자열을 분할하게 되고, 결과는 `["", "4seveneight"]` 배열이 된다.
join
배열의 모든 요소를 연결하여 하나의 문자열로 만든다.
구분자를 매개변수로 넣어 배열 요소 사이에 삽입할 수 있다.
`["", "4seveneight"].join("1");`을 실행하면, 배열 요소 사이에 "1"이 삽입되어 "" + "1" + "4seveneight" 즉, `"14seveneight"`가 반환된다.
function solution(s) {
let numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
var answer = s;
for(let i=0; i< numbers.length; i++) {
let arr = answer.split(numbers[i]); // 현재 숫자에 해당하는 영단어를 구분자로 사용하여 문자열을 분할
answer = arr.join(i); // 분할된 배열을 숫자 (i)로 연결
}
return Number(answer);
}
영단어 -> 숫자 치환 과정
(1) `split(numbers[i])`을 사용하여 입력 문자열 s에서 현재의 영단어 numbers[i]를 찾아 분할.
(2) 이 분할 과정에서 영단어는 제거되고, 영단어가 있던 위치에는 빈 문자열이 들어감. `["", "4seveneight"]`
(3) `arr.join(i)`를 통해 분할된 배열 요소 사이에 해당 숫자를 문자열로 삽입하여 다시 연결.
이렇게 활용해버리다니 다시봐도 미쳣당..