https://school.programmers.co.kr/learn/courses/30/lessons/12930
아주 오래전에 풀었던 문제인데 기억도 안나고 스터디 덕분에 다시 풀게 되었다.
나의 풀이
function solution(s) {
const result = s.split(" ").map((word) => {
if(word.match(/\D/)){
return [...word].reduce((acc,cur,index) => {
if(index%2) return acc += cur.toLowerCase()
return acc += cur.toUpperCase()
},"")
}
return word
}).join(" ")
return result
}
처음 접근법은 문자만 빼서 조건에 맞게 바꾼후 replace를 통해서 넣을려고 했는데 테스트 케이스 몇개가 틀리다고 나왔다.
그 이유는 "LLHLLL lHlL" 이러한 케이스도 있기 때문이다.
위 케이스를 문자만 빼서 조건에 맞게 수정하면 "LlHlLl" "LhLl" 이렇게 되는데
replace를 하면 먼저 "LLHLLL"을 "LIHILI"로 바꾼다. 그리고 "IHIL"과 같은 것을 찾아야 하는데
처음 바꾼 문자열 "LIHILI" 안에 "IHIL"이 포함되어있어서 한번 더 바꾸게되어 "LLhLll"이 나오게 된다.
그래서 결과적으로 "LLhLll" "IHIL" 이렇게 된다 /g플래그를 넣는다 해도 앞에 문자는 여전히 변경된다.
따라서 실시간으로 문자만 받아서 바로 바꿔줘야겠다고 생각했다.
1. split를 통해 공백단위로 쪼갠다.
2. map을 통해 문자이면 if문안에 코드를 실행하고 공백이면 공백을 그대로 return하게 만들었다.
2-1. if 문안에서는 문자일 경우에 그 문자를 쪼개서 reduce로 하나하나 조건에 맞게 대문자,소문자로 바꿔준다.
2-2 reduce를 통해 바뀐 문자열이 return 되기에 문제 조건이 맞는 것들이 map을 통해 완성된다.
3. 마지막으로 join을 통해 처음에 공백단위로 쪼개놓았던 문자열을 다시 합친다.
여기서 다른 사람 풀이보고 replace 공식문서 공부한 뒤 다시 풀어보았다.
재 풀이
function solution(s) {
const replacer = (_,p1,p2) => {
const odd = p2?.toLowerCase()
const even = p1.toUpperCase()
return odd ? even + odd : even
}
return s.replace(/(\w)(\w){0,1}/g, replacer)
}
처음부터 toUpperCase()를 할 필요없이 replace만으로 풀었다. 문자열이 1개인 경우를 대비해 (\w){0,1}을 해주었다.
또한 repacer 함수에서도 문자열이 하나이면 홀수가 없기에 p2?.로 하였고 홀수가 존재하는 경우만 짝수랑 홀수를 return하도록 하여 에러를 방지하였다.
"hello" 이렇게 문자열이 여러개여도 (\w)(\w){0,1} 자체는 특정 단어가 아니고 연속된 문자이거나 단문자이면 되기 때문에
처음에 "he"를 replace하고 "ll"을 replace하고 마지막으로 "o"를 replace한다.
여기서 플래그 /g를 빼면 "he"만 replace하고 끝난다.
soruce : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace
다른 사람 풀이
function toWeirdCase(s){
//함수를 완성해주세요
return s.toUpperCase().replace(/(\w)(\w)/g, function(a){return a[0].toUpperCase()+a[1].toLowerCase();})
}
오 이거 괜찮은 것 같다.
어차피 문자열이 1개이면 무조건 대문자이기에 일단 전부 대문자로 만들어주고 연속되는 문자열 즉 짝수 홀수구분해야하는 문자열만 뽑아서 조건에 맞게 바꿔준다.
특히 (\w)(\w) 표현에대해서 알아간다.
또한 replace에 대한 공부를 더 해야할 것 같다.
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스 - JS] level.1 둘만의 암호 (0) | 2023.02.09 |
---|---|
[프로그래머스 - JS] level.1 다트 게임 (0) | 2023.01.31 |
[프로그래머스-JS] level.1 모의고사 <완전탐색> / 다시풀기o (0) | 2023.01.17 |
[프로그래머스 - JS] level.1 과일 장수 (0) | 2023.01.15 |
[프로그래머스 - JS] level.2 주차 요금 계산 (0) | 2023.01.02 |