프로그래머스 불량 사용자 문제는 사용자 리스트와 밴 리스트가 주어졌을 때 밴된 사용자를 구하는 문제다. 난이도는 레벨3이며 그래프 탐색을 통해 해결할 수 있다.
프로그래머스 - 불량 사용자 문제 정보
알고리즘 분류
- 그래프
난이도
- Level 3
문제 요약
- 사용자 아이디 리스트와 밴 아이디 리스트가 주어짐
- 밴 아이디 리스트는 사용자 아이디 중 밴된 사용자들의 아이디로, 아이디의 일부가 *로 마스킹처리 되어있음
- 밴된 사용자 리스트의 경우의 수를 구하라.
문제 풀이 과정
- 쉬운 문제인 줄 알고 시작했으나.. 생각보다 오래 걸림
- 일단 사용자 아이디 각각이 어떤 밴 아이디에 걸리는지를 확인해서 따로 저장함
- 그리고 밴 아이디 개수만큼 사용자 아이디를 뽑아야 되는데, 문제는 순서가 없고 중복도 안된다는 것..!
- 대신 사용자 아이디 리스트의 길이가 최대 8이라서, 8자리 String을 Set에 넣어서 답 중복 확인함
코드
import java.util.*; class Solution { private boolean[][] candidates = new boolean[8][8]; private Set<String> answers = new HashSet<>(); private int userLen = 0, banLen = 0; public int solution(String[] user_id, String[] banned_id) { userLen = user_id.length; banLen = banned_id.length; // candidates 배열에 i번째 밴아이디에 j번째 사용자 아이디가 밴되는지 체크 for(int i = 0; i < banLen; i++) { for(int j = 0; j < userLen; j++) { if (isBanned(banned_id[i], user_id[j])) { candidates[i][j] = true; } } } // 매핑되는 경우의 수를 8자리 String으로 표현하여 구함 getCases(new StringBuilder("00000000"), 0); return answers.size(); } // banned_id에 user_id가 해당되는지 확인 private boolean isBanned(String banned_id, String user_id) { if (banned_id.length() == user_id.length()) { for(int idx = 0; idx < banned_id.length(); idx++) { if (banned_id.charAt(idx) != '*' && banned_id.charAt(idx) != user_id.charAt(idx)) { return false; } } return true; } return false; } // visited: 현재까지 밴된 아이디들, hereBanIdx: 이번에 확인할 밴아이디 private void getCases(StringBuilder visited, int hereBanIdx) { // 마지막 밴아이디까지 체크했으면 정답셋에 넣기 if (hereBanIdx == banLen) { answers.add(visited.toString()); return; } // 다음 밴아이디로 밴되는 사용자아이디 확인 후 방문 for(int idx=0;idx<userLen;idx++) { if (candidates[hereBanIdx][idx] && visited.charAt(idx) == '0') { visited.replace(idx,idx+1,"1"); getCases(visited, hereBanIdx+1); visited.replace(idx,idx+1,"0"); } } } }
- 시간복잡도: O(N*N)
- 공간복잡도: O(N*N)
개선사항
- 애초에 DFS를 의도한 문제라서 N이 매우 작지만, 비슷한 경우에서 N이 조금이라도 커지면 더 나은 방법을 찾아야 할 것 같다.
- String으로 비트마스크를 표현하지 말고 진짜 비트마스크를 써보는 시도를 해보자.
728x90
'알고리즘' 카테고리의 다른 글
[Java] 프로그래머스 - 징검다리 건너기 (0) | 2023.12.07 |
---|---|
[Java] 프로그래머스 - 가장 먼 노드 (0) | 2023.11.23 |
[Java] 프로그래머스 - 기지국 설치 (0) | 2023.11.09 |
[Java] 프로그래머스 - 단속카메라 (0) | 2023.11.09 |
[Java] 프로그래머스 - 숫자 게임 (0) | 2023.11.09 |
댓글