문제 설명
알파벳 소문자로 이루어진 문자열 myString이 주어집니다. 알파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 return 하는 solution 함수를 완성해 주세요.
🙋♀️ 내 생각
처음에는 인덱스를 통해서 접근하다가 갑자기 replaceAll()이 번쩍 떠올랐다.
replaceAll()과 정규식을 이용하면 어렵지 않게 풀 수 있는 문제이다.
✅ 내 코드
function solution(myString) {
return myString.replaceAll(/[a-k]/g,'l')
}
replaceAll()은 String에서 원하는 모든값을 찾아서 특정한 값으로 변환할 수 있는 메서드이다.
(찾아서 새롭게 바꾸고 싶은값, 새롭게 바뀔 값)을 인자로 넣어준다.
이 문제에서는 l앞에 위치하는 모든 알파벳들을 l로 치환해야하기 때문에 정규식을 이용해서 a-k까지의 범위를 지정하였다.
[a-k]는 [a,b,c,d...,k]와 같이 일일이 적어주는 것과 같은 역할을 한다.
그리고 새롭게 바뀔 값인 'l'을 두번째 인자로 적어준다.
💻 학습한 것
🔫 replaceAll()에는 global하지 않은 정규식은 올 수 없다.
문제를 풀때는 위의 코드로 풀고 제출했는데 만약 g를 지우면 어떨지 궁금해서 지워보았다.
(g는 정규식의 flag로 하나만 찾는것이 아니라 전역적(global)하게 값을 찾고 싶을때 사용한다)
그랬더니 이런 타입에러가 발생했다.
replacAll()에는 non-global 정규식은 올수없다는 말인데, 나는 replaceAll()은 어차피 전역적인 성질을 가지고 있기때문에 g를 지워도 동일한 결과가 나오지 않을까 기대했었다.
replace()에서 global하게 쓰고 싶을때 g을 붙이는 걸로 알고 있었는데 repplaceAll()은 항상 g를 붙여줘야하는것을 알게 되었다.
위의 코드를 replace()를 쓰고 flag로 g를 써도 이 문제를 풀 수 있다.
function solution(myString) {
return myString.replace(/[a-k]/g,'l')
}
flag로 g를 붙여줌으로써 global하게 값을 찾을 수 있어서 replaceAll()과 같은 효과를 낼 수 있다.
💻 다른사람 코드중에 배울 것
function solution(myString) {
var answer = '';
let al = "abcdefghijklmnopqrstuvwxyz";
for(let i of myString){
if(al.indexOf(i)<al.indexOf("l")){
answer += "l";
}
else{
answer += i;
}
}
return answer;
}
다른 사람들의 코드를 읽어보다가 내가 원래 하려고 했던 방식이었던 인덱스를 이용한 것중에 배울것이 있는 코드가 있어서 공부하였다.
이 코드를 공부한 이유는 for문에서의 i의 활용법때문이다.
나는 주로 for of문에서 i를 이용해서 숫자의 범위를 지정하고 일정하게 더하는 방법만 썼는데, 이 코드에서는 i에 문자를 할당했다.
💻 학습한 것
for...of 문: 반복가능한 객체(Array,Map,Set,String,TypedArray,arguments객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성
배열이나 이터럴블한 객체를 순회하는 반복문인데, String도 이터러블하기 때문에 for...of문을 사용해서 문자열을 순회할 수 있다.
for(let i of myString){
if(al.indexOf(i)<al.indexOf("l")){
answer += "l";
}
else{
answer += i;
}
}
myString을 한 문자씩 순회하면서 각 문자에 대해서 반복적인 특정 작업을 수행한다.(if문안의 작업들)
반복문의 각 반복에서 i에는 현재 순회중인 문자가 할당된다.
➡️ for (let i of myString) 구문을 사용하여 문자열을 순회하면서 문자열의 각 문자에 접근하고 작업을 수행할 수 있다.
그리고 if문을 통해서 각각의 값들의 인덱스를 비교하여 만약"l"의 인덱스보다 작다면, answer에 "l"을 추가한다.
그리고 인덱스보다 크다면 answer에 각각의 문자열인 i를 추가하여 answer를 완성시킨다.
🙋♀️ 내 생각
replaceAll()을 이용하면 쉽게 풀 수 있는 문제이지만, 인덱스를 이용해서 풀면 조금 더 코드가 복잡해진다.
for문 안에는 거의 항상 유사한 형태의 조건들을 넣었던 것 같은데, 이렇게 for of문을 이용해서 각각의 값을 할당할 수 있다는 것을 알게 되어 좋았다. 나름대로 모던자바스립트 책도 열심히 읽었는데 확실히 책으로 볼때보다 실제 코드를 통해 봐야 확 와닿는것 같다. 이렇게 알고리즘 문제를 풀면서 이해한 자바스크립트가 나중에 실제 실무나 프로젝트를 할 때도 크게 도움이 되리라 믿는다. 아마 이렇게 알고리즘을 풀면서 자바스크립트의 이해도가 높아지고 있다고 느끼는 것처럼 실제 구현하기를 많이하고 많이 접하면 더 깊은 이해가 따라올 것이다.
이렇게 알고리즘을 통해 쌓은 지식을 구현을 통해서 한단계 더 업그레이드 시켜야겠다.
'JavaScript > 알고리즘' 카테고리의 다른 글
프로그래머스 부분 문자열 이어 붙여 문자열 만들기 JS ( 배열의 index로 2개의 배열매칭, 중첩배열에서 값추출 ) (0) | 2023.06.20 |
---|---|
프로그래머스 문자열 섞기 JS ( 복합할당 연산자 += ) (1) | 2023.06.19 |
프로그래머스 간단한 식 계산하기 JS ("연산자"처리하기, if문/switch문/객체 이용하기, eval()은 ❌) (1) | 2023.06.16 |
프로그래머스 배열 만들기 2 JS ( /^[패턴]+$/, 정규식으로 숫자를 찾으려면 String으로 타입변환 ) (0) | 2023.06.16 |
프로그래머스 0떼기 JS ( /^0/.test()-0으로 시작하는지? / slice(1)로 맨앞하나만제거 / number는 맨앞의 0이 JS 제거되는 특징 ) (1) | 2023.06.16 |