프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제는 두 단계로 나눠서 풀었다.
1단계) banned_id의 조건을 만족하는 user_id 찾기
2단계) 찾은 user_id들의 조합 만들기
1단계에서는 javascript의 정규식 표현을 사용했다. 정규식 표현을 이용하면 문자열을 쉽게 다룰 수 있다.
banned_id에서 모든 *을 .로 바꾸고 앞뒤로 ^와 $를 붙여 정규식 표현을 생성한다.
user_id에서 정규식 표현에 맞는 요소만을 필터링해서 저장한다.
2단계에서는 저장한 user_id들의 조합을 찾는다.
조합은 재귀함수를 사용했다.
재귀함수는 user_id 배열 list와 빈 배열 combinations를 입력받는다.
함수는 list의 0번째 요소(banned_id를 통해 찾아낸 user_id 배열)를 순회한다. 배열의 요소를 조합에 넣고, list의 0번째 요소를 제외하고 재귀한다.
list의 길이가 0이라면 모든 요소의 조합을 찾은 경우이므로 set에 저장한다.
이 때, set에 배열 자체를 넣으면 배열의 주소를 인식해서 중복을 제대로 처리하지 못하기 때문에 배열의 요소를 정렬하고 join으로 묶어서 문자열로 만들어준다.
마지막으로 set의 크기를 반환하면 끝.
코드
function solution(user_id, banned_id) {
var answer = 0;
// 각 banned_id에 대해 정규표현식으로 user_id를 필터링하여 매칭되는 user_id를 찾는다.
var ban = [];
for (var i = 0; i < banned_id.length; i++) {
var regex = new RegExp(`^${banned_id[i].replace(/\*/g, '.')}$`);
var matched = user_id.filter((id) => {
return regex.test(id);
});
ban[i] = matched;
}
var set = new Set();
// 각 banned_id에 대해 매칭되는 user_id의 조합을 구한다.
function comb(list, combinations) {
if (list.length === 0) {
var temp = new Array(...combinations);
set.add(temp.sort().join(','));
return;
}
for (var i = 0; i < list[0].length; i++) {
var user = list[0][i];
if (!combinations.includes(user)) {
combinations.push(user);
comb(list.slice(1), combinations);
combinations.pop();
}
}
}
comb(ban, []);
answer = set.size;
return answer;
}
결과
후기
일단 정규식 표현을 사용해야했다. 자주 쓰지 않았던 기능이라 연습이 됐다.
그리고 재귀함수로 조합을 찾는 부분도 처음에는 쉽게 만들었지만, 중복된 조합을 제대로 처리하지 못했다.
이를 해결하기 위해 Set을 사용해야했다.
'코딩연습' 카테고리의 다른 글
(javascript) 자동완성 (0) | 2025.04.16 |
---|---|
(javascript) 네트워크 (0) | 2025.04.14 |
(JavaScript) 숫자 변환하기 (0) | 2025.02.10 |
(Javascript) 뒤에 있는 큰 수 찾기 (0) | 2025.02.03 |
(JavaScript) 신고 결과 받기 (0) | 2024.12.27 |