-
[LeetCode] 929. Unique Email Addresses알고리즘 문제 풀이 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
풀이
기본적으로 한 개의 이메일 주소에 대해서 문제에서 제시하는 규칙을 적용하는 코드를 작성해보자.
- 주어진 이메일을 '@'를 기준으로 로컬 이름과 도메인 이름을 분리
- 로컬 이름에 대해서 '.' 또는 '+' 탐색
- '+' 발견했다면, 탐색 중지: 이후 문자는 무시해야 하기 때문
- '.'을 발견했다면, 해당 문자를 무시
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
'알고리즘 문제 풀이' 카테고리의 다른 글
[LeetCode] 725. Split Linked List in Parts (0) 2021.09.30 [LeetCode] 922. Sort Array By Parity II (0) 2021.09.29 [LeetCode] 332. Reconstruct Itinerary (0) 2021.09.27 [LeetCode] 1328. Break a Palindrome (0) 2021.09.24 [LeetCode] 1239. Maximum Length of a Concatenated String with Unique Characters (0) 2021.09.23