https://programmers.co.kr/learn/courses/30/lessons/81301
let s = "one4seveneight"
// result 1478
문자열을 숫자로 바꿔야 하기에 자연스럽게 숫자를 기준으로 잘라서 바꿔야겠다고 생각했다. 전개연산자를 써보고, 숫자를 기준으로 나눠진 배열을 조합해 어떤 숫자로 치환할지 정했는데, 말도 안되는 작업이란걸 깨달아버렸다. 배열로 쪼개진 ["one"] 혹은 ["o","n","e"] 입력을 숫자로 바꾸려 했다니,,
sol 1
const s = "one4seveneight"
function solution(s) {
let answer = "";
const numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
let filter = "";
for(let i=0;i<s.length;i++) {
let str = s[i].match(/[a-z]/g);
if(str === null) {
answer += s[i];
} else {
filter += s[i];
if(numbers.includes(filter)) {
answer +=numbers.indexOf(filter);
filter = "";
}
}
}
return Number(answer);
}
console.log(solution(s));
1. 빈배열 filter를 만들어 둔다.
filter의 역할은 for문을 돌며 쌓인 알파벳의 조합이 numbers의 요소중 일치하는게 있는지 확인한다. 마지막 4번에서 설명을 덧붙인다.
2. 알파벳 확인
for문에서 str은 문자열 상태의 s에 대해 한글자씩 숫자인지 알파벳인지 확인한다.
만약 알파벳의 대소문자를 모두 찾는 match() 메서드를 사용하고 싶다면 .match(/[a-z]gi) 를 사용하면 된다.
3. 숫자라면 바로 answer로 보내주기
for문이 순회하면서 첫번째 순회에서 'o' 두번째 순회에서 'on' 세번째 순회에서 'one' 네번째 순회에서는 숫자를 만나기 때문에 str에 쌓이지 않고 answer로 이동한다. 즉 알파벳만을 탐색하는 match() 메서드를 사용했기 때문에 숫자인 요소는 null 이 출력되고 if문으로 null을 찾아준다.
4. 알파벳을 숫자로 바꿔주고 필터 비워주기
세번째 순회에서 str = "one" 이 된 상태이기 때문에 마지막 if문을 만난다. numbers 배열에서 "one"을 포함하고 있기 때문인데, answer에 one의 인덱스인 1 을 보내주고 다시 알파벳을 쌓기위해 필터를 비워준다.
5. Number로 출력
완성된 answer는 문자열 상태기 때문에 숫자로 바꿔준다.
sol 2
const s = "one4seveneight"
function solution(s) {
s = s.replace(/zero/g, 0)
.replace(/one/g, 1)
.replace(/two/g, 2)
.replace(/three/g, 3)
.replace(/four/g, 4)
.replace(/five/g, 5)
.replace(/six/g, 6)
.replace(/seven/g, 7)
.replace(/eight/g, 8)
.replace(/nine/g, 9)
return Number(s);
}
console.log(solution(s))
어차피 숫자는 9까지 이기 때문에 /g 를 사용해 전역에 있는 모든 알파벳을 숫자로 바꾸게 하면 된다.
sol 3
const s = "one4seveneight"
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);
}
return Number(answer);
}
console.log(solution(s));
1. split으로 나눠주기
split() 메서드는 문자열 객체를 지정한 구분자를 이용하여 나눈 후 배열로 반환한다. split()으로 받는 인수가 문자열에 없다면, 원본 배열을 반환다.
let num = '12345';
console.log(num.split('3')); // [ '12', '45' ]
// 인수로 전달한 문자열은 없어진다
console.log(num.split('8'); // [ '12345' ]
solution 함수로 전달받은 식별자 s 를 바로 사용하지 않고, answer에 할당해서 쓰는 이유는 split() 메서드가 원본 문자열을 변경시키기 때문이다. (for문으로 원본 문자열을 계속 돌아야 하기 때문)
2. join()으로 배열을 다시 문자열로 붙여준다.
위 설명처럼 문자열인 answer는 split() 메서드로 쪼개진 후 배열로 반환된다. 쪼개지는 기준점이 된 인수 자리는 없어지기 때문에, 그 자리에 구분자로 매치되는 숫자를 넣은 후 다시 문자열로 반환한다.
3. 문자열을 숫자로
join() 메서드는 문자열로 반환하기에 Number 객체를 사용한다.표준 빌트인 객체인 Number를 new 연산자 없이 호출하면 인스턴스가 아닌 숫자를 반환한다. 즉 명시적인 타입 변환이 가능하다.
피드백
문자열과 배열의 메서드들을 언제든 꺼내 쓸 수 있게 숙달되어야 한다. 문제를 보자마자 뭘로 첫 라인을 시작해야 하냐 가 아니라 어떤 방식으로 문제를 접근하고 그 접근 방식을 어떻게 코드로 구현할 지 생각하는 훈련이 필요하다.
'Study > Algorithm' 카테고리의 다른 글
[programmers / JavaScript] K번째 수 (0) | 2022.05.06 |
---|---|
[BEAKJOON / node.js] 5533 유니크 (0) | 2022.05.02 |
<BEAKJOON / node.js> 10828 스택 (0) | 2022.04.29 |
<BEAKJOON> 4344 JavaScript (0) | 2022.04.26 |
<programmers / JavaScript> 직사각형 별찍기 (0) | 2022.04.14 |