[프로그래머스] 64064 불량 사용자 - JAVA

2025. 5. 31. 21:57·알고리즘/문제풀이

[프로그래머스] 64064 불량 사용자 - JAVA

문제

https://school.programmers.co.kr/learn/courses/30/lessons/64064

문제 분석

조건

불량 사용자 목록이 주어진다. 불량 사용자 아이디의 일부 문자가 `*`로 마스킹된 형태로 주어질 때, 사용자 아이디 중 불량 사용자 목록에 주어진 패턴들과 매칭될 수 있는 유저 아이디조합의 경우의 수를 구하는 문제이며, 같은 조합의 경우 1가지로 계산한다.

풀이방법

`banned_id`에 포함된 `*`문자를 `.`으로 바꾸어 정규표현식을 활용할 수 있도록 하였다. 조합을 구할 때처럼 user_id 중 정규식에 맞는 조합으로 탐색하였으며 중복된 조합을 제거하기 위해 `Set`을 사용하였다.

코드

import java.util.*;

class Solution {
    static Set<String> answerSet = new HashSet<>(); // 중복 조합 방지를 위한 Set
    static boolean[] checks;    // 조합에 들어간 단어 체크

    public int solution(String[] user_id, String[] banned_id) {

        for (int i = 0; i < banned_id.length; i++) {
            // 정규식 활용을 위한 문자 변환
            banned_id[i] = banned_id[i].replace('*', '.');
        }
        checks = new boolean[user_id.length];
        combination(0, new String[banned_id.length], banned_id, user_id);

        return answerSet.size();
    }

    /**
     * 단어 조합을 만드는 함수
     *
     * @param depth
     * @param combi
     * @param bannedIds
     * @param userIds
     */
    private void combination(int depth, String[] combi, String[] bannedIds, String[] userIds) {
        if (depth == bannedIds.length) {
            // 분량 사용자 수만큼 아이디를 찾으면 해당 답을 Set에 넣기 위해 정렬한다.
            // 제재 아이디 목록들을 구했을 때 아이디들이 나열된 순서와 관계없이 아이디 목록의 내용이 동일하다면 같은 것으로 처리 < 문제 조건
            String[] answer = Arrays.copyOf(combi, combi.length);
            Arrays.sort(answer);
            answerSet.add(Arrays.toString(answer));
            return;
        }
        for (int i = 0; i < userIds.length; i++) {
            if (userIds[i].length() != bannedIds[depth].length()
                    || checks[i]) { // 문자열 길이와 이미 사용한 아이디인지 체크
                continue;
            }
            if (userIds[i].matches(bannedIds[depth])) {
                checks[i] = true;
                combi[depth] = userIds[i];
                combination(depth + 1, combi, bannedIds, userIds);
                checks[i] = false;
            }
        }
    }
}

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'알고리즘/문제풀이' 카테고리의 다른 글
  • [백준/BOJ] 19236 청소년 상어 - JAVA
  • [프로그래머스] 42628 이중우선순위큐 - JAVA
  • [백준/BOJ] 9663 N-Queen - JAVA
  • [프로그래머스] 43105 정수 삼각형 - JAVA
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • 바이브코딩 (1)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    비트마스킹
    LV2
    BFS
    JWT
    SSAFY 9기
    ssafy 합격 후기
    SSAFY
    Java
    최장증가부분수열
    커서ai
    Springsecurity
    백준
    Spring
    알고리즘
    dp
    프로그래머스
    그리디
    바이브코딩
    알고리즘 문제풀이
    dfs
    LIS
    너비우선탐색
    리액트
    springboot
    lv3
    Security
    BOJ
    싸피
    느좋코딩
    pccp모의고사
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
LIRI
[프로그래머스] 64064 불량 사용자 - JAVA
상단으로

티스토리툴바