막무가내로 삽질하는 알고리즘

UniqueEmailAddresses

Jungsoomin :) 2020. 10. 25. 17:24

문자열 조작은 생각만치 언제나 쉽지않다. StringBuilder 를 사용해보려고 노력해도 쉽지가 않더라.

 

Every email consists of a local name and a domain name, separated by the @ sign.
For example, in alice@leetcode.com, alice is the local name, and leetcode.com is the domain name.
Besides lowercase letters, these emails may contain '.'s or '+'s. If you add periods ('.') between some characters in the local name part of an email address, mail sent there will be forwarded to the same address without dots in the local name.
For example, "alice.z@leetcode.com" and "alicez@leetcode.com" forward to the same email address. (Note that this rule does not apply for domain names.)
If you add a plus ('+') in the local name, everything after the first plus sign will be ignored.
This allows certain emails to be filtered, for example m.y+name@email.com will be forwarded to my@email.com. (Again, this rule does not apply for domain names.)
It is possible to use both of these rules at the same time.
Given a list of emails, we send one email to each address in the list.
How many different addresses actually receive mails?

 

  • @을 기준으로 자르고 .을 제거한다. ( 길이와 @ 의 인덱스는 변수화 )
  • String builder 로 + 이후는 "" 로 치환한다.
  • @ 이후를 가져와 StringBuilder 에 추가한다.
  • list 의 contains 를 이용해 동일한 값을 검사한다.
  • list를 배열로 리턴한다. 
 /**
     * @을 기준으로 자르고 .을 제거한다.
     * String builder 로 + 이후는 "" 로 치환한다.
     * @ 이후를 가져와 StringBuilder 에 추가한다.
     * list 의 contains 를 이용해 동일한 값을 검사한다.
     * list를 배열로 리턴한다.
     * @param email
     */
    private static void solve(String[] email) {
        StringBuilder builder = null;
        int len = 0;
        int at = 0;
        List<String> list = new ArrayList<>();

        for (int i = 0; i < email.length; i++) {
            at = email[i].indexOf("@");
            String domain = email[i].substring(at,email[i].length());
            String newName = email[i].substring(0,at).replace(".", "");
            builder = new StringBuilder(newName);

            len = builder.length();
            builder.replace(builder.indexOf("+"), len,"");
            builder.append(domain);

            if(!list.contains(builder.toString())){
                list.add(builder.toString());
            }
        }

        String[] answer =  list.toArray(new String[list.size()]);
        System.out.println(Arrays.toString(answer));
    }

풀이는 이러하다.

 

  • 자료구조는 늘 신중히 택한다. 중복을 허용하지 않으며, 순번은 중요하지 않으므로 Set을 사용한다.
  • 단위별로 잘라 메서드로 구현하는 것객체지향 언어 답다.
  • @를 기준으로 앞뒤로 올바른 문자열로 조작하여 리턴하는 메서드를 사용한다.
  • @를 합친 값을 Set에 넣으면 중복 이슈는 알아서 해결된다.
public class UniqueEmailAddressesTeaching {
    public static void main(String[] args) {
        String email = new String("test.email+soomin@coding.com");
        String email1 = new String("test.e.mail+soo.min@coding.com");
        String email2 = new String("t.e.st.em.a.il+soomin@cod.ing.com");
        String[] emails = new String[]{email, email1, email2};

        solve(emails);
    }

    private static void solve(String[] emails) {
        //밥 그릇 만들기
        Set<String> set = new HashSet<>();

        //
        for (String email : emails) {
            String localName = makeLocalName(email);
            String domainName = makeDomainName(email);
            // set 은 알아서 중복을 허용하지 않음 !!
            set.add(localName + "@" + domainName);
        }
        set.forEach(s -> System.out.println(s));
    }

    private static String makeLocalName(String email) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < email.length(); i++) {
            //에러처리
            if (email.charAt(i) == '.') {
                continue;
            }
            if (email.charAt(i) == '+') {
                break;
            }
            if (email.charAt(i) == '@') {
                break;
            }
            String str = String.valueOf(email.charAt(i));
            builder.append(str);
        }
        return builder.toString();
    }

    private static String makeDomainName(String email) {
        return email.substring(email.indexOf("@") + 1);
    }
}

'막무가내로 삽질하는 알고리즘' 카테고리의 다른 글

MaximumSubArray  (0) 2020.11.03
Longest Substring With At Most Two Distinct  (0) 2020.10.26
PlusOne  (0) 2020.10.25
KClosest  (0) 2020.10.25
다리를 지나는 트럭  (0) 2020.10.19