문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
메모
같은 옹알이를 연속으로 할 수 없다는 점을 주의해서 풀어야 한다.
- 배열에서 발음 가능한 문자열을 각각의 숫자로 치환한다.
- map을 돌려 배열의 모든 요소를 개별적으로 쪼개고 숫자로 바꾼다.
- filter를 통해 숫자가 아닌 배열을 제거한다.
- for문으로 해당 배열에 연속된 숫자가 있으면 "X"를 추가한다.
- filter로 "X"가 없는 배열을 세서 반환한다.
정답
function solution(babbling) {
for (let i = 0; i < babbling.length; i++) {
babbling[i] = babbling[i].replaceAll("aya", 1); // 'aya'를 1로 치환
babbling[i] = babbling[i].replaceAll("ye", 2); // 'ye'를 2로 치환
babbling[i] = babbling[i].replaceAll("woo", 3); // 'woo'를 3으로 치환
babbling[i] = babbling[i].replaceAll("ma", 4); // 'ma'를 4로 치환
}
babbling = babbling.map(x => x.split("").map(Number)); // 각 문자열을 배열로 변환 후 숫자로 변환
babbling = babbling.filter(x => !x.includes(NaN)); // NaN이 포함되어 있지 않은 배열만 남김
for (let i = 0; i < babbling.length; i++) {
let tmp = babbling[i];
for (let j = 0; j < tmp.length; j++) {
if (tmp[j] === tmp[j + 1]) tmp[j] = "X"; // 같은 숫자가 연속으로 나오면 'X'로 치환
}
}
return babbling.filter(x => !x.includes("X")).length; // 'X'가 포함되어 있지 않은 배열의 개수 반환
}
function solution(babbling) {
const regexp1 = /(aya|ye|woo|ma)\1+/; // 'aya', 'ye', 'woo', 'ma' 중 같은 패턴이 두 번 이상 나오는지 검사할 정규식
const regexp2 = /^(aya|ye|woo|ma)+$/; // 'aya', 'ye', 'woo', 'ma'만으로 이루어진 문자열인지 검사할 정규식
return babbling.reduce((ans, word) => (!regexp1.test(word) && regexp2.test(word) ? ++ans : ans), 0);
}