해당 포스팅은 이전 기수 프리코스 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)이 될 것 같은데 해당 코드가 효율적이지 않은 것 같다. 분명 더 좋은 방법이 있을 것 같은데 더 고민해봐야 할 것 같다 🤣