[프로그래머스] 숫자 문자열과 영단어
https://programmers.co.kr/learn/courses/30/lessons/81301
숫자의 일부 자릿수가 영단어로 표기되어 있고, 이를 숫자로 다시 바꾸는 문제.
- 1478 → "one4seveneight"
- 234567 → "23four5six7"
- 10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열이 매개변수로 주어진다.
문자열이 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해야 함.
제한사항
- 1 ≤ s의 길이 ≤ 50
- s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않음
- return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어짐
영문으로 나타낸 숫자를 가진 배열 strings 와 숫자 배열 numbers를 만들고,
for문 내에서 0번째부터 10번째 위치까지 strings배열 내에 있는 텍스트를 포함하는지 확인한다.
확인 결과가 true면, 해당 문자열을 같은 위치의 numbers로 대체(replace)해 준다.
리턴값은 숫자여야 하기 때문에, 마지막에 parseInt()도 해 준다.
function solution(s) {
var strings = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
];
var numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
for (i = 0; i < 10; i++) {
if (s.includes(strings[i])) {
s = s.replace(strings[i], numbers[i]);
}
}
s = parseInt(s);
return s;
}
solution("2three4fivefivefivefivesixseven");
이렇게 했을 때 문제점이...
"같은 문자열이 여러 번 나오는 경우"는 맨 앞에 나오는 문자열만 변환해 준다는 것이다.
예를 들어, "2three4fivefivefivefivesixseven"을 받았을 때 올바른 결과값은 234555567 이지만,
위 코드의 결과로는 2345 가 출력된다.
원래는 replaceAll() 함수를 사용하고 싶었으나, 버전 문제인지 그런 함수는 없다는 에러메시지가 계속 떴고,
그래서 우선은 "해당 문자열이 몇 번 나오는지" 구한 후, 그 횟수만큼 replace를 반복하도록 코드를 수정했다.
function solution(s) {
var strings = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
];
var numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
for (i = 0; i < 10; i++) {
if (s.includes(strings[i])) {
// string[i]이 몇 번 들어가는지 세어서 변수 c 에 저장해 준다.
var c = s.split(strings[i]).length - 1;
for (j = 0; j < c; j++) {
//그리고 그 횟수만큼 반복해서 해당 string을 number로 바꿔줄 것임.
s = s.replace(strings[i], numbers[i]);
}
}
}
s = parseInt(s);
return s;
}
solution("2three4fivefivefivefivesixseven"); //정상적으로 234555567 출력.
그러고보니 0번째 문자가 zero부터 시작하니...
굳이 numbers라는 배열을 만들어줄 필요는 없었군... ~.~;
내가 하고 싶었던 모범 답안이 있길래 복사해 옴 ↓
아직 객체 다루는 게 익숙하지 않네...
function solution(s) {
let charSet = {
"zero" : 0,
"one" : 1,
"two" : 2,
"three" : 3,
"four" : 4,
"five" : 5,
"six" : 6,
"seven" : 7,
"eight" : 8,
"nine" : 9,
}
for(let [key, value] of Object.entries(charSet)) {
let re = new RegExp(key,"g");
s = s.replace(re, value);
}
return parseInt(s);
}
'코테연습' 카테고리의 다른 글
[LeetCode] Longest Common Prefix (0) | 2022.03.09 |
---|---|
[LeetCode] Roman to Integer (0) | 2022.02.13 |
[프로그래머스] 약수의 개수와 덧셈 (0) | 2022.02.09 |