코딩연습

(javascript) 불량 사용자

Realuda72 2025. 4. 22. 20:02

코딩테스트 연습 - 불량 사용자 | 프로그래머스 스쿨

 

프로그래머스

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