해당 포스팅은 이전 기수 프리코스 1주차 6번 문제를 풀어보았다.
private static List<String> solution(String[][] emailArray) {
Map<String, Integer> map = emailsBySubstring(emailArray);
HashSet<String> resultSet = checkNickName(emailArray, map);
return sortList(resultSet);
}
private static Map<String, Integer> emailsBySubstring(String[][] emailArray) {
HashMap<String, Integer> map = new HashMap<>();
for (String[] strings : emailArray) {
String email = strings[0];
String nickName = strings[1];
myAccountValidate(email, nickName);
for (int j = 0; j < nickName.length() - 1; j++) {
String subNickName = nickName.substring(j, j + 2);
map.put(subNickName, map.getOrDefault(subNickName, 0) + 1);
}
}
return map;
}
private static HashSet<String> checkNickName(String[][] emailArray, Map<String, Integer> map) {
HashSet<String> resultSet = new HashSet<>();
for (String[] strings : emailArray) {
String email = strings[0];
String nickName = strings[1];
for (String key : map.keySet()) {
if (map.get(key) >= 2 && nickName.contains(key)) {
resultSet.add(email);
break;
}
}
}
return resultSet;
}
private static List<String> sortList(HashSet<String> resultSet) {
List<String> result = new ArrayList<>(resultSet);
Collections.sort(result);
return result;
}
private static void myAccountValidate(String email, String nickName) {
if (!email.contains("email.com")) {
throw new IllegalArgumentException("도메인은 email.com 만 가능합니다.");
}
if (!validateKorean(nickName)) {
throw new IllegalArgumentException("닉네임은 한글만 가능합니다.");
}
if (nickName.length() >= 20 || nickName.length() < 1) {
throw new IllegalArgumentException("닉네임의 길이는 1자 이상 20자 미만 이여야 합니다.");
}
}
public static boolean validateKorean(String word) {
Pattern validateKoreanPattern = Pattern.compile("^[가-힣]+$");
Matcher matcher = validateKoreanPattern.matcher(word);
return matcher.matches();
}
로직은 arr를 돌면서 nickName을 2글자씩 분리해 map 저장하고, map에 저장된 value가 2번 이상 나탔을때 set에 저장해주면서 중복을 제거하고 마지막에 오름차순으로 정렬을 수행한다.
validate 부분은 메서드 단위로 분리하여 검증을 할 수 있게 구현했는데, 한국어임을 어떻게 검증할까 고민을 한 것 같다. 이 부분은 정규표현식을 통해 구현할 수 있음을 알게되었고 적용해보았다.
일단 시간복잡도가 O(nm)이 될 것 같은데 해당 코드가 효율적이지 않은 것 같다. 분명 더 좋은 방법이 있을 것 같은데 더 고민해봐야 할 것 같다 🤣