2024. 8. 29. 21:03ㆍ[Node.js_6기 본캠프 TIL]
▶ 알고리즘 코드카타_숫자 문자열과 영단어(JavaScript)
◈ 고민 시작
예시와 같이 문자로 표현된 숫자와 일반 숫자 타입의 데이터가 섞여있는 s를 모두 숫자로 return하는 문제이다. 띄어쓰기와 같은 형태로 분리되어 있지도 않기 때문에 split()을 사용해서 매칭되는 숫자를 return 하기도 어려웠다.
for문과 if문의 조건을 썼다가 지우기를 반복하고, 삼항연산자도 썼다가 지우기를 반복했다. 그러다 문득 최근 풀었던 문제 중에 알파벳을 뒤로 하나씩 미는 내용이 있었는데 그 때 본 풀이를 이 문제에도 적용할 수 있지 않을까? 라는 생각이 들었다.
아스키 코드를 사용하지 않고 매칭되는 데이터들을 나열한 변수를 선언하고 for, if, indexOf 등을 사용하던 것이 참 매력적인 코드였는데... 이 문제에서도 영문 숫자를 나열하고, index 값을 불러오게 하면 될 것 같았다.
먼저 똑같이 영문 숫자명을 배열로 선언해주었다. 이전 문제와는 달리, 단어의 형태로 판별해야 하기 때문에 string 형태가 아닌 배열 형태로 선언해야 했다. 또한 "zero"부터 "nine"까지 인덱스 값을 추출하면 그대로 0부터 9가 나오기 때문에, for문을 num_eng을 기준으로 돌려줘야 했다.
function solution(s) {
let num_eng = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
for(let i=0; i<num_eng.length; i++){
// s에서 매칭되는 영문 숫자를 인덱스 값으로 교체
}
return answer;
그렇다면 s에서 띄어쓰기도 없이 불규칙하게 들어간 영문을 어떻게 찾아서 교체해주어야 할까. replace 같은 메서드가 있을 것 같은데- 라고 생각하고 검색해봤더니 정말 있었다. 그러나 MDN에서 예시를 아무리 봐도 어떻게 사용하는 것인지 헷갈려서, 조금 더 풀어 쓴 블로그 글들을 한참 찾아봤다.
그러던 중, 이 문제에서 사용해야 할 메서드는 replace()가 아닌 replaceAll()이라는 사실을 발견했다.
replace() 메서드는 해당 문자열을 한 번만 찾아 변경하고 replaceAll()은 해당하는 문자열을 모두 찾아 치환한다. |
// replace 메서드 예시
let str = 'ab?c?'
str = str.replace("?", "@") // ab@c?
// replaceAll 메서드 예시
let str = 'ab?c?'
str = str.replaceAll("?", "@") // ab@c@
s가 "zerozero37"이면 "0037"로 바꿔주어야 하는데, replace를 쓰면 한번만 바꿔주기 때문에 "0zoro37"이 되어버리기 때문이다.
◈ 풀이
function solution(s) {
let num_eng = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
for(let i=0; i<num_eng.length; i++){
s = s.replaceAll(num_eng[i], i);
}
return Number(s);
}
위의 내용을 참고하여 s 안에 num_eng의 요소에 해당하는 것이 있다면, 그것을 인덱스 값으로 바꾸는 로직을 채워넣었다. 또한 s가 기본적으로 string 상태이므로, 숫자 형태로 return 해주기 위해 return Number(s)로 값을 도출하게 했다.
처음에 바꿔넣는 것 때문에 push나 join 같은 걸 써야하나 머리가 아팠었는데, split이나 복잡한 방법을 쓰는 것이 아닌 replaceAll로 한번에 해결되어 정말 다행이었다.
참고 자료:
'[Node.js_6기 본캠프 TIL]' 카테고리의 다른 글
[Node.js_6기] 본캠프 TIL_0902 (0) | 2024.09.02 |
---|---|
[Node.js_6기] 본캠프 TIL_0830 (0) | 2024.08.30 |
[Node.js_6기 본캠프] CH 2. 개인과제_KPT (1) | 2024.08.28 |
[Node.js_6기 본캠프] CH 2. 개인과제 트러블 슈팅_0827 (0) | 2024.08.27 |
[Node.js_6기 본캠프] CH 2. 개인과제 트러블 슈팅_0826 (0) | 2024.08.26 |