반응형
문제
345번 문제 - Reverse Vowels of a String
문제 설명
문자열에서
모음(aeiou)만 반대 순서로 뒤집는 문제
내가 푼 코드
- 입력받은 문자열을 배열로 만든다.
- 모음의 인덱스를 저장할 빈 배열과 모음을 저장하는 문자열을 만든다.
- 반복문을 돌며 모음인 문자열(대문자 포함)의 인덱스를 2번에서 만든 배열에 추가한다.
- 반복문을 돌며 만들어진 배열을 배열의 크기의 반만큼 반복되게 한다.
- 반복문을 돌며 해당 인덱스에 해당하는 모음을 반대로 저장시킨다.
join을 사용해 문자열로 만들고 반환한다.
풀이 코드
정규표현식과 고차함수인filter를 활용해 모음만 있는 문자열을 배열로 저장한다.
정규표현식의 test() 메소드는 대상 문자열 속에 일치하는 문자열이 포함되어 있는지 검사하고 true 또는 false를 반환한다.
- 입력된 문자열을 또다시 정규식을 이용해 split하고, split될 때마다 1번에서 저장된 배열의 값을 추가하면 모음만 reverse된 값이 저장된다.
- 고차함수는 정말 바로 떠올려 내기 어려운 것 같다. 고차함수 많이 쓰는 연습하기 필수!!
성공 코드
내가 푼 코드
const reverseVowels = s => {
const strList = s.split("");
const vowels = "aeiou";
let vowelIndexList = [];
strList.forEach((element, index) => {
if (vowels.includes(element.toLowerCase())) {
vowelIndexList.push(index);
}
});
const SIZE = vowelIndexList.length;
const halfIndex = Math.floor(SIZE / 2);
for (let i = 0; i < halfIndex; i++) {
const j = vowelIndexList[i];
let temp = strList[j];
strList[j] = strList[vowelIndexList[SIZE - 1 - i]];
strList[vowelIndexList[SIZE - 1 - i]] = temp;
}
return strList.join("");
};
풀이 코드
const reverseVowels = s => {
const vowels = s.split('').filter(a => /[aeiou]/i.test(a));
return s.split(/[aeiou]/i).reduce((res, a) => res + a + (vowels.pop() || ''), '');
};반응형