[우아한테크 도전기] 이전 기수 프리코스 1주차_6번 연습

Dev_ch·2023년 9월 3일
0

우아한테크 도전기

목록 보기
28/51
post-thumbnail
post-custom-banner

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

profile
내가 몰입하는 과정을 담은 곳
post-custom-banner

0개의 댓글