[Leetcode] 947. Most Stones Removed with Same Row or Column

buy Seroquel without a rx 문제: https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/

article source 이 문제는 해석하면 행, 열이 겹치는 경우 각 점을 지울 수있다. 그려면 가장 많이 지울 수 있는 횟수는 몇번인지 알아내는 문제이다. connected component를 구하고
“connected component 개수 * (connected component의 크기 -1)” 가 우리가 구하는 값이다.

그래프 DFS 탐색으로 connected component를 구하여 풀 수 있지만, disjoint set으로 문제를 풀 수 있다. 같은 행이나 같은 열이 등장하면 두 점을 하나로 합치도록 한다. 나는 다음과 같이 시도를 했다.

class Solution:
    def removeStones(self, stones: List[List[int]]) -> int:
        
        set_list = []
        set_dict = {}
        for index, (r, c) in enumerate(stones):
            
            row_key = "r"+str(r)
            col_key = "c"+str(c)
            
            if row_key not in set_dict and col_key not in set_dict:
                #row, col 둘다 기존에 없는 경우
                new_set = set()
                set_dict[col_key] = set_dict[row_key] = new_set
                set_dict[row_key].add(index)
                set_list.append(new_set)
                
            elif row_key in set_dict and col_key not in set_dict:
                # row만 기존에 있는 경우 -> 기존 집합에 추가
                set_dict[row_key].add(index)
                set_dict[col_key] = set_dict[row_key]
                
            elif col_key in set_dict and row_key not in set_dict:
                # col만 기존에 있는 경우 -> 기존 집합에 추가 
                set_dict[col_key].add(index)
                set_dict[row_key] = set_dict[col_key]
                
            else:
                row_set = set_dict[row_key]
                col_set = set_dict[col_key]
                
                if row_set != col_set:
                    
                    row_set.update(col_set)
                    row_set.add(index)
                    for i in col_set:
                        set_dict["r{}".format(stones[i][0])] = row_set
                        set_dict["c{}".format(stones[i][1])] = row_set
                    col_set.clear()
                else:
                    row_set.add(index)
                    
        ret = 0
        for set_item in set_list:
            if len(set_item) > 0:
                ret += len(set_item) - 1
            
        return ret
        

결과

Runtime: 124 ms, faster than 40.43% of Python3 online submissions forMost Stones Removed with Same Row or Column.
Memory Usage: 13.7 MB, less than 31.94% of Python3 online submissions for Most Stones Removed with Same Row or Column.

속도는 그다지 빠르지 않게 나왔다.

리트코드 Solution에는 좀더 효율적으로 작성이 되어있고 코드 길이도 짧다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다