LeetCode #721

Accounts Merge

1개의 풀이 · Python

문제 원문 보기 ↗

SOLUTION INFO

Python · main.py

main.py
class Solution:
    def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
        N = len(accounts)
        uf = [i for i in range(N)]

        def find(x: int) -> int:
            while x != uf[x]:
                uf[x] = uf[uf[x]]
                x = uf[x]
            return x

        def merge(u: int, v: int) -> bool:
            u, v = find(u), find(v)
            if u == v:
                return False
            uf[u] = v
            return True

        owner = {}
        for idx, account in enumerate(accounts):
            for email in account[1:]:
                if email in owner:
                    merge(idx, owner[email])
                else:
                    owner[email] = idx

        groups = defaultdict(list)
        for email, x in owner.items():
            groups[find(x)].append(email)

        return [
            [accounts[i][0]] + sorted(emails)
            for i, emails in groups.items()
        ]

SOLUTION DESCRIPTION

풀이 설명

각 계정을 유니온 파인드의 정점으로 보고, 같은 이메일을 가진 계정들을 하나의 집합으로 합친다. 이메일별로 처음 등장한 계정 인덱스를 기록하면 이후 같은 이메일을 만날 때 두 계정을 연결할 수 있다. 마지막에는 대표 계정별 이메일을 모아 정렬하고 계정 이름을 앞에 붙인다. 이메일 수를 E라고 할 때 합치기는 O(E alpha(N)), 정렬은 전체적으로 O(E log E)이다.

GITHUB COMMUNITY

커뮤니티 평가

GitHub 계정으로 남긴 최신 평가 1건만 반영하며, 데이터는 매일 저장소에 동기화됩니다.

최근 동기화

체감 난이도

아직 평가 없음

첫 난이도 평가를 남겨주세요.

문제 추천

아직 평가 없음

이 문제가 도움이 되었는지 알려주세요.

이 문제 평가하기

GitHub 로그인 후 난이도를 제출하고, 원하는 경우 추천 여부도 함께 남길 수 있습니다.

추천 여부 (선택)

평가하려면 GitHub로 로그인해 주세요.

평가는 자동으로 저장소 Discussion에 기록되므로 Discussion 화면을 직접 열 필요가 없습니다. 같은 문제를 다시 평가하면 기존 평가가 갱신됩니다.

DISCUSSION

댓글

GitHub 로그인 후 작성할 수 있으며 모든 댓글은 이 저장소의 Discussions에 보관됩니다.