[Java] ํ๋ก๊ทธ๋๋จธ์ค - ๋ถ๋ ์ฌ์ฉ์
[๋ฌธ์ ]
https://school.programmers.co.kr/learn/courses/30/lessons/64064
[ํ์ด]
์ฐ์ banned_id[]๋ฅผ ํ์ํ๋ฉฐ ๊ฐ banned_id์ ๋์๋ ์ ์๋ user_id๋ค์ index๊ฐ์ bandList.get(index)์ ์ ์ฅํ์์ต๋๋ค. ์ด๋, ban์ด ๊ฐ๋ฅํ ์ด๋ฆ์ธ์ง boolean banned(String ban, String name)์ ํตํด *๊ฐ ์๋ ๋ฌธ์๋ค์ ๋น๊ตํ๋ฉฐ ํ์ธํฉ๋๋ค. ์ ์ถ๋ ฅ ์1์ ์์๋ก ์ดํด๋ณด๋ฉด, ์๋์ ๊ฐ์ด banList๊ฐ ์ด๊ธฐํ ๋ฉ๋๋ค.
[[0, 1], [3]]
๋ค์์ผ๋ก void makeSet(String[] user_id, String[] banned_id, int cnt, String set, boolean[] visit)์ ํธ์ถํ์ฌ ๊ฐ๋ฅํ ์กฐํฉ๋ค์ ๋ฝ์์ ๋งคํ์ด ์๋ฃ๋ user_id์ ์กฐํฉ์ ๊ฐ index๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ String ํํ๋ก ์ ์ฅํ ๊ฐ์ names์ ์ถ๊ฐํฉ๋๋ค. ์ด๋ names๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์์๊ฐ ๋ค๋ฅด๋๋ผ๋, ๊ฐ์ ์ด๋ฆ๋ค์ด ์ ์ฅ๋ ๊ฒฝ์ฐ ์ค๋ณต์ผ๋ก ์ฒ๋ฆฌํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
(index๋ค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด Arrays.sort()๋ฅผ ํ์ฉํ์์ต๋๋ค.)
๋งคํ์ด ๋ชจ๋ ์๋ฃ๋ ์์1์ names๋ ์๋์ ๊ฐ์ต๋๋ค.
[03, 13]
๋ง์ง๋ง์ผ๋ก names์ ํฌ๊ธฐ๋ฅผ ๊ตฌํด answer์ ์ ์ฅํ ํ ๋ฐํํฉ๋๋ค.
[์ฝ๋]
import java.util.*;
class Solution {
public static ArrayList<String> names = new ArrayList<String>();
public static ArrayList<ArrayList<Integer>> banList = new ArrayList<ArrayList<Integer>>();
public static int N;
public int solution(String[] user_id, String[] banned_id) {
int answer = 0;
N = banned_id.length;
for(int i=0;i<N;i++) {
banList.add(new ArrayList<Integer>());
for(int j=0;j<user_id.length;j++) {
if(banned(banned_id[i], user_id[j])) {
banList.get(i).add(j);
}
}
}
boolean[] visit = new boolean[user_id.length];
makeSet(user_id, banned_id, 0, "", visit);
answer = names.size();
return answer;
}
public static void makeSet(String[] user_id, String[] banned_id, int cnt, String set, boolean[] visit) {
if(cnt == N) {
char[] StringtoChar = set.toCharArray();
Arrays.sort(StringtoChar);
String str = new String(StringtoChar);
if(!names.contains(str)) {
names.add(str);
}
return;
}
for(Integer i:banList.get(cnt)) {
if(visit[i]) {
continue;
}
visit[i] = true;
String nextStr = set + i;
makeSet(user_id, banned_id, cnt + 1, nextStr, visit);
visit[i] = false;
}
}
public static boolean banned(String ban, String name) {
int len = ban.length();
if(len != name.length()) {
return false;
}
for(int i=0;i<len;i++) {
if(ban.charAt(i) != '*' && ban.charAt(i) != name.charAt(i)) {
return false;
}
}
return true;
}
}