https://school.programmers.co.kr/learn/courses/30/lessons/133499
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
입력
babbling - 문자열 배열
출력
result - "aya", "ye", "woo", "ma"을 조합하여 만들 수 있는 문자열 중 연속하지 않은 문자열을 제외한 원소의 개수
(가령, "ayaaya"는 연속한 문자열이므로 제외시킨다.)
제한사항
- 1 ≤ babbling의 길이 ≤ 100
- 1 ≤ babbling[i]의 길이 ≤ 30
- 문자열은 알파벳 소문자로만 이루어져 있습니다.
풀이
이 문제는 보자마자 filter와 정규표현식과 length 프로퍼티가 떠올랐다. 왜냐하면 "aya", "ye", "woo", "ma" 주어진 문자열이 포함되었거나 일치되었거나 연속되었는지 판단할 때는 정규표현식이 가장 쉽기 때문이다. 그리고 filter 메소드를 이용해서 문제에 나온 조건을 확인하고 일치하는 원소만 남기고 마지막으로 result 즉 남은 원소의 개수를 반환하기 위해서 length 프로퍼티를 이용했다.
주어진 조건을 정리하면 다음과 같았다.
- "aya", "ye", "woo", "ma"만을 조합한 문자열
- "ayaaya" "yeye"와 같이 연속되지 않은 문자열
첫 번째 조건으로 정규표현식을 만들면 /^(aya|ye|woo|ma)+$/ 이렇게 나온다. '^'과 '$'는 각각 원소의 처음과 끝이고 '()'는 그룹, '+
는 반복할 수 있다, '|'는 'or'이다.
두 번째 조건은 그저 연속된 문자열이 있는지 확인하고 false여야 조건에 성립하도록 만들었다.
시간 복잡도는 배열을 순회하고 정규표현식을 검사하기에 배열의 길이 n, 각 원소 문자열의 길이 m이라고 할 때 O(n*m)이다.
공간 복잡도는 배열만을 다루므로 O(n)이다.
코드
function solution(babbling) {
var answer = babbling.filter(x=>(/^(aya|ye|woo|ma)+$/.test(x) && !/(ayaaya|yeye|woowoo|mama)/.test(x))).length;
return answer;
}
정규표현식에 대해서 좀 더 깊게 공부해야겠다.
^(|)+$ 새롭다.
다른 사람의 풀이를 보니 /1 이런 그룹을 사용하기도 하는데 차차 배워나가야겠다.
'Computer > 알고리즘' 카테고리의 다른 글
[JS] 프로그래머스 같은 숫자는 싫어 (2) | 2025.01.20 |
---|---|
[JS] 프로그래머스 숫자 짝궁 (2) | 2025.01.20 |
[JS] 프로그래머스 햄버거 만들기 (1) | 2025.01.17 |
[JS] 프로그래머스 문자열 나누기 (0) | 2025.01.16 |
[JS] 프로그래머스 대충 만든 자판 (0) | 2025.01.15 |