알고리즘 문제 풀이

[LeetCode] 929. Unique Email Addresses

_OB1N 2021. 9. 28. 10:26

문제 출처: https://leetcode.com/problems/unique-email-addresses/

 

Unique Email Addresses - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


문제

모든 유효한 이메일은 '@'기호로 구분되는 로컬 이름도메인 이름으로 구성된다. 추가적으로 이메일은 소문자와 더불어 한 개 이상의 '.' 또는 '+'를 포함할 수 있다.

  • 예를 들어, "alice@leetcode.com"에서 "alice"는 로컬 이름이고 "leetcode.com"은 도메인 이름입니다.

만약 이메일 주소의 로컬 이름 부분에 일부 문자 사이에 '.'이 있다면, 메일은 로컬 이름의 쉼표가 없는 주소로 보내질 것입니다. 이 규칙은 도메인 이름에는 적용되지 않습니다.

  • 예를 들어, "alice.z@leetcode.com"과 "alicez@leetcode.com"은 동일한 주소입니다.

만약 로컬 이름에 '+'가 있다면, 첫 번째 더하기 기호 이후의 문자는 모두 무시됩니다. 이를 통해 특정 이메일을 필터링할 수 있습니다. 이 규칙은 도메인 이름에는 적용되지 않습니다.

  • 예를 들어, "m.y+name@email.com"은 "my@email.com"이 됩니다.

이 규칙들이 동시에 적용될 수 있습니다.

 

문자열 emails의 리스트가 주어지면, 실제로 다른 이메일 주소를 개수를 반환하라.

예제

Input: emails = ["test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"]
Output: 2

Explanation: "testemail@leetcode.com" and "testemail@lee.tcode.com" actually receive mails.
Input: emails = ["a@leetcode.com","b@leetcode.com","c@leetcode.com"]
Output: 3

풀이

기본적으로 한 개의 이메일 주소에 대해서 문제에서 제시하는 규칙을 적용하는 코드를 작성해보자.

  1. 주어진 이메일을 '@'를 기준으로 로컬 이름과 도메인 이름을 분리
  2. 로컬 이름에 대해서 '.' 또는 '+' 탐색
    • '+' 발견했다면, 탐색 중지: 이후 문자는 무시해야 하기 때문
    • '.'을 발견했다면, 해당 문자를 무시
function applyRule(email) {
    const [local, domain] = email.split('@');
    
    let tmpLocal = "";
    
    for (let i = 0; i < local.length; i++) {
    	if (local[i] == '+') { break; }
    	if (local[i] == '.') { continue; }
        tmpLocal += local[i];
    }
    
    return tmpLocal + '@' + domain;
}

이 과정을 언어(javascript)에 내장되어 있는 함수를 사용하면 다음과 같습니다.

function applyRule(mail) {
    let [local, domain] = mail.split('@');
    local = local.replaceAll('.', '').split('+')[0];
    return local + '@' + domain;
}

이 함수를 모든 이메일이 적용하는 것으로 각 이메일을 실제 사용될 이메일로 변경할 수 있습니다.

 

남은 과정은 동일한 이메일을 제거하는 과정입니다. set(집합) 자료구조를 사용하는 것으로 간단하게 코드로 작성할 수 있습니다. set 자료구조는 원소 간 중복을 허용하지 않는 자료구조이기 때문에 규칙을 적용한 이메일을 set 자료구조에 입력하는 것 만으로 중복되지 않는 이메일을 구할 수 있는 효과를 얻을 수 있습니다.

var numUniqueEmails = function(emails) {
    const uniqueEmails = new Set();
    emails.forEach(email => {
    	uniqueEmails.add(applyRule(email));
    });
    return uniqueEmails.size;
}

 

Github: 929.js

 

GitHub - opwe37/Algorithm-Study

Contribute to opwe37/Algorithm-Study development by creating an account on GitHub.

github.com