2023년 06월 02일 금요일 - 오 6월이네..?


오늘 올려볼 문제는 2101번 Detonate the Maximum Bombs 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

leetcode 문제 사진

오늘도 LeetCode 사이트 오늘의 문제를 가지고 왔다.

아니 요즘 블로그 쓰는걸 완전 까먹어


입력


사진에서도 볼 수 있듯이 2차원 int 배열이 입력으로 들어온다.



풀이 및 코드


각 좌표들이 폭탄의 중심과 폭발 반경을 나타낸다.

한 폭탄을 터뜨렸을 때 최대한 많이 폭탄을 터뜨릴 수 있는 개수를 구하는 문제이다.


오늘은 조금 헤매다가 문제를 풀었다.

처음에는 union find를 사용하려고 했는데 생각해보니 union find를 하게되면 첫 번째 폭발에 연쇄되어서 폭발하는지 판별이 불가능 했다.

그래서 이후에는 dfs를 활용해서 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int maximumDetonation(int[][] bombs) {
        var set = new HashSet<Integer>();
        int result = 0;
        
        for(int i = 0; i < bombs.length; i++) {
            if(set.contains(i)) continue;
            
            var dfsSet = dfs(bombs, new HashSet<>(), i);
            
            result = Math.max(result, dfsSet.size());
            
            for(var num : dfsSet) set.add(num);
        }
        
        return result;
    }
    
    private HashSet<Integer> dfs(int[][] bombs, HashSet<Integer> set, int now) {
        set.add(now);
        
        for(int i = 0; i < bombs.length; i++) {
            if(set.contains(i)) continue;
            
            var a = bombs[now];
            var b = bombs[i];
            
            long length = a[2], x = Math.abs(a[0] - b[0]), y = Math.abs(a[1] - b[1]);
            
            if(length * length >= x * x + y * y) dfs(bombs, set, i);
        }
        
        return set;
    }
}




제출 화면

leetcode 문제 맞았습니다


시간 좀 줄여보겠다고 union find를 생각하고 거기에 얽매여서 생각보다 푸는데 오래걸렸다.

다음에는 조금 더 유연하게 생각해봐야겠다.


내일도 문제를 풀어서 블로그에 글을 쓸 수 있으면 좋겠다.

+ Recent posts