본문 바로가기
LeetCode/Array & Hashing

[LeetCode][Kotlin] 929. Unique Email Addresses

by jinwo_o 2024. 10. 18.

929. Unique Email Addresses

Every valid email consists of a local name and a domain name, separated by the '@' sign. Besides lowercase letters, the email may contain one or more '.' or '+'.

  • For example, in "alice@leetcode.com", "alice" is the local name, and "leetcode.com" is the domain name.

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. Note that this rule does not apply to domain names.

  • For example, "alice.z@leetcode.com" and "alicez@leetcode.com" forward to the same email address.

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. Note that this rule does not apply to domain names.

  • For example, "m.y+name@email.com" will be forwarded to "my@email.com".

It is possible to use both of these rules at the same time.

 

Given an array of strings emails where we send one email to each emails[i], return the number of different addresses that actually receive mails.

모든 유효한 이메일은 '@' 기호로 구분된 로컬 이름과 도메인 이름으로 구성됩니다. 이메일에는 소문자 외에 '.'가 하나 이상 포함될 수 있습니다. 또는 '+'. 

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

마침표 '.'를 추가하면 이메일 주소의 지역 이름 부분의 일부 문자 사이에 전송된 메일은 지역 이름에 점이 없는 동일한 주소로 전달됩니다. 이 규칙은 도메인 이름에는 적용되지 않습니다. 

예를 들어 "alice.z@leetcode.com"과 "alicez@leetcode.com"은 동일한 이메일 주소로 전달됩니다. 

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

예를 들어 "m.y+name@email.com"은 "my@email.com"으로 전달됩니다. 

이 두 규칙을 동시에 사용하는 것이 가능합니다. 

각 이메일[i]에 하나의 이메일을 보내는 문자열 이메일 배열이 주어지면 실제로 메일을 받는 서로 다른 주소의 수를 반환합니다.

 

Example 1:

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.

 

Example 2:

Input: emails = ["a@leetcode.com","b@leetcode.com","c@leetcode.com"]

Output: 3

 

Constraints:

  • 1 <= emails.length <= 100
  • 1 <= emails[i].length <= 100
  • emails[i] consist of lowercase English letters, '+', '.' and '@'.
  • Each emails[i] contains exactly one '@' character.
  • All local and domain names are non-empty.
  • Local names do not start with a '+' character.
  • Domain names end with the ".com" suffix.
  • Domain names must contain at least one character before ".com" suffix.

코드 1

class Solution {
    fun numUniqueEmails(emails: Array<String>): Int {
        val answer = HashSet<String>()

        emails.forEach { email ->
            var (local, domain) = email.split("@")
            local = local.replace(".", "").split("+").first()
            answer.add("$local@$domain")
        }

        return answer.size
    }
}

 

코드 2

class Solution {
    fun numUniqueEmails(emails: Array<String>): Int {
        val answer = HashSet<String>()

        emails.forEach { email ->
            var i = 0
            var res = ""

            while (email[i] != '+' && email[i] != '@') {
                if (email[i] != '.') res += email[i]
                i++
            }

            while (email[i] != '@') i++
            
            res += email.substring(i, email.length)
            answer.add(res)
        }

        return answer.size
    }
}