@옹알이(1)
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
정규표현식을 사용하는 것이 가장 편할 것 같아 보이기 때문에 정규표현식을 공부하는 시간을 갖기로 했다
정규 표현식을 사용하지 않고 중첩 for 문을 돌리는 방법도 있지만
function solution(babbling) {
let count = 0;
const possible = ["aya", "ye", "woo", "ma"];
for(let b of babbling) {
for(const p of possible) {
b = b.replace(p, "_")
console.log(b);
if((b.includes("_") && b.length == 1) || (b.includes("__") && b.length == 2) || (b.includes("___") && b.length == 3) || (b.includes("____") && b.length == 4)) {
console.log("실행")
count++;
break;
}
}
}
return count;
}
이처럼 복잡한 코드가 나오게 된다
('문자열').match (/정규표현식/ 플래그 )
'문자열'에서 '정규표현식' 에 매칭되는 항목을 ~배열~로 반환한다
-> 반환값이 배열이라는 것을 주의하자
('문자열').replace (/정규표현식/ , "대체문자열" )
'문자열'에서 '정규표현식'에 매칭되는 항목을 '대체문자열' 로 변환해준다
('문자열').split (/정규표현식/ )
'문자열'을 '정규표현식'을 기준으로 쪼개어 배열로 반환한다
(정규표현식).text('문자열')
'문자열'과 '정규표현식'이 매칭되면 true, 아니면 false 를 반환한다
-> 반환값이 boolean
(정규표현식).exec('문자열')
match 와 비슷한 역할을 하지만 첫번째 매칭 결과만 반환한다
i -> 대소문자를 구분하지 않고 검색한다
g -> 문자열 내의 모든 패턴을 검색한다
/g 가 없으면 최초 검색결과 한번을 반환하지만 있으면 모든 검색 결과를 배열로 반환해준다
m -> 행이 바뀌더라도 계속 검색한다
s -> .(모든 문자 정규식) 이 개행 문자 \n에도 포함하도록 한다
u -> 유니코드 전체를 지원한다
y -> 문자 내 특정 위치에서 검색을 진행하는 "sticky"모드를 활성화한다
a-zA-Z 영어알파벳(-으로 범위 지정)
ㄱ-ㅎ가-힣 한글 문자(-으로 범위 지정)
0-9 숫자(-으로 범위 지정)
. 모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두)
% 단, 줄바꿈 X
\d 숫자
\D 숫자가 아닌 것
\w 밑줄 문자를 포함한 영숫자 문자에 대응
% [A-Za-z0-9_] 와 동일
\W \w 가 아닌 것
\s space 공백
\S space 공백이 아닌 것
\특수기호 특수기호 * \^ \& ! \? ...등
| -> OR
[] -> 괄호안의 문자들 중 하나. or 처리 묶음 보면 된다.
/abc/ -> "abc" 전체를 검색한다
/[abc]/ -> "a" 또는 "b" 또는 "c" 를 검색한다
[다-바] -> 다 or 라 or 마 or 바
[^문자] -> 괄호안의 문자를 제외한 것
[^lgEn] - > "l" "g" "E" "N" 4개 문자를 제외
% 대괄호 안에서 쓰면 제외의 뜻, 대괄호 밖에서 쓰면 시작점 뜻
^문자열 -> 특정 문자열로 시작 (시작점)
/^www/
문자열$ -> 특정 문자열로 끝남 (종착점)
/com$/
정규표현식에 대한 문법이 이보다 더 많지만 알고리즘을 푸는 것에 있어 최소한 알아야 하는 수준인 것 같다
사이트에서 정규 표현식을 연습해볼 수 있다
function solution(babbling) {
let filtered = babbling.map(e=>e.match(/aya|ye|woo|ma/g))
let result = 0
for (let i =0;i<babbling.length;i++) {
if (filtered[i]==null) {}
else if (filtered[i].join('') == babbling[i] ) result++
}
return result
}
babbling 배열을 map 메서드를 이용해서 각 요소에 정규 표현식을 매치시켜서 나누어 주고
그 배열을 join 하여 기존의 배열과 비교하여서
같을 경우에 발음할 수 있다고 판단 후 result 에 가능한 요소들을 세어주는 방식으로 해결하였다
정규표현식이 복잡해 보이지만 js 에서는 특히 특정 상황에서 유용하다