코테/프로그래머스

[프로그래머스/Level3] 불량 사용자 (JAVA)

imname1am 2024. 5. 13. 13:25
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

💡  풀이 방식

• DFS

필요 자료구조
- 해당 응모 사용자 ID를 사용할지 판별 용 1차원 boolean형 배열
- 현재까지 선택된 응모한 사용자 ID의 조합 집합 Set<Set<String>> result🔥

 

 

[제재 ID 목록 만드는 메소드 dfs(선택된 응모 사용자 ID 갯수, 현재까지 선택된 사용자 ID의 집합)]

. 종료 조건 : 불량 사용자 갯수만큼 뽑았을 때, 여태 구한 제재 ID 경우를 집합에 넣는다.

. 그만큼 뽑지 않았다면, 응모한 사용자 ID 배열을 돌면서 해당 사용자 ID와 현재 탐색 중인 불량 사용자가 일치하는 경우, 해당 사용자 ID로 조합을 만든다.

for(int i = 0 ; i < user_id.length ; i++) {
    if(set.contains(user_id[i]))    continue;   // 이미 선택된 사용자 id면 pass

    if(match(user_id[i], banned_id[depth])) {
        set.add(user_id[i]);
        dfs(depth + 1, new HashSet<>(set));
        set.remove(user_id[i]);
    }
}

   ㄴ 둘이 일치하는지 확인하는 함수 : 응모한 사용자 ID와 불량 사용자 ID, 이 둘의 길이가 같고, 같은 위치에서 *이 아닌 같은 문자로 구성되어야 한다.

// 해당 사용자 ID가 현재 탐색 중인 banned_id와 일치하는지 확인하는 메소드
private static boolean match(String uId, String bId) {
    if(uId.length() != bId.length()) return false;  // 길이가 다르면 바로 pass

    for(int i = 0 ; i < uId.length() ; i++) {
        if(bId.charAt(i) != '*' && uId.charAt(i) != bId.charAt(i))
                return false;
    }

    return true;
}

 

 

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.*;
 
class Solution {
    static String[] user_id, banned_id;
 
    static boolean[] chk;
    static Set<Set<String>> result = new HashSet<>(); // 가능한 조합
    
    public int solution(String[] user_id, String[] banned_id) {
        this.user_id = user_id;
        this.banned_id = banned_id;
        
        chk = new boolean[banned_id.length];
        dfs(0new HashSet<>());     
        
        return result.size(); // 가능한 조합 수
    }
    
    private static void dfs(int depth, Set<String> set) {   // set: 현재까지 선택된 사용자 ID의 집합
        if(depth == banned_id.length) {
            result.add(set);
            return;
        }
        
        for(int i = 0 ; i < user_id.length ; i++) {
            if(set.contains(user_id[i]))    continue;   // 이미 선택된 사용자 id면 pass
            
            if(match(user_id[i], banned_id[depth])) {
                set.add(user_id[i]);
                dfs(depth + 1new HashSet<>(set));
                set.remove(user_id[i]);
            }
        }
    }
    
    // 해당 사용자 ID가 현재 탐색 중인 banned_id와 일치하는지 확인하는 메소드
    private static boolean match(String uId, String bId) {
        if(uId.length() != bId.length()) return false;  // 길이가 다르면 바로 pass
        
        for(int i = 0 ; i < uId.length() ; i++) {
            if(bId.charAt(i) != '*' && uId.charAt(i) != bId.charAt(i))
                    return false;
        }
        
        return true;
    }
}
cs

 


💦 어려웠던 점

- 중복을 피한 조합을 만들어야지 생각하면서 Set을 활용할 생각은 하지 못 했다.... (Set<Set<String>> 도!)

 

 

🧐 새로 알게 된 내용

- dfs 변수에 set을 들고 다니면서 뽑은 원소 조합을 들고 다니는 아이디어

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[프로그래머스] Lv.3 불량 사용자.java

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

velog.io

 

반응형