문제
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.
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.
문제 해석
- 이메일이 주어진다. 주어진 이메일은 @ 문자 앞의 Local, @ 뒤에 Domain으로 나누어진다.
- 아래에 몇가지 규칙이 있다. 이 규칙을 적용해 중복되지 않는 이메일의 개수를 출력해야한다.
- Local name : '.' 은 무시해야한다. '+'가 왼쪽에서부터 차례대로 확인했을때 가장 처음 등장한 부분부터 @ 까지 무시해야한다.
- Domain name : 위 규칙이 적용되지 않는다.
문제 해설
- 딕셔너리나 셋을 사용하여 문제를 풀 수 있다.
- 규칙이 다르기 때문에 Local name과 Domain name을 분리시킨다.
- 규칙에 맞게 파이썬 함수를 사용하여, '.' 는 무시한다. 그리고 첫번째 '+' 자리를 찾아, 그 이후 문자들은 제거한다.
- 다시 Local name과 Domain name을 합쳐서 딕셔너리에 있는지 확인하고 없으면, 정답 개수를 늘려준다.
- 딕셔너리에 저장하면서, 동일한 이메일 주소가 있다면 넘어가면 된다.
정답코드
class Solution:
def numUniqueEmails(self, emails: List[str]) -> int:
email_dict = dict()
ans = 0
for email in emails:
local, domain = email.split('@')
local = re.sub("\.", "", local)
plus_index = local.find("+")
if plus_index != -1:
local = local[:plus_index]
email = local + "@" + domain
if email not in email_dict:
ans += 1
email_dict[email] = 1
return ans
'컴퓨터공학 > LeetCode 1000' 카테고리의 다른 글
물건 사고 파는 문제 파이썬 order, sell, return (0) | 2022.03.07 |
---|---|
a+b=c 숫자식에서 각 숫자의 한자리 수 치환을 통해 식을 맞게 만드는 방법 (0) | 2022.03.07 |
[LeedCode] 1167. Minimum Cost to Connect Sticks 파이썬 Medium (0) | 2021.11.06 |
[LeedCode]819. Most Common Word 파이썬 Easy (0) | 2021.11.04 |
[LeedCode] 53. Maximum Subarray 파이썬 Easy (0) | 2021.11.04 |