스위핑 알고리즘

스위핑 알고리즘은 1차원이나 2차원 공간에서 여러 개의 객체가 주어졌을 , 특정 축을 기준으로 방향으로 진행(스위핑)하며 문제를 해결하는 알고리즘으로 주로 기하학적 문제의 풀이에서 많이 사용된다.

아래의 예시와 같이 전체 선분의 범위 만큼의 배열을 잡은 후 선분의 시작 점에 +1, 나갈 때 -1 하는 방식으로 어느 x좌표에서 중복되는 선분의 갯수를 파악하기 편리하다.

 

해당 문제를 단순 구현할 경우 통상적으로 O(n*m)의 시간이 걸리지만 

        for (int i = start; i <= end; i++) {
            int tmp=0;
            for (Pos height : heights) {
                int max = Math.max(height.start,height.end);
                int min = Math.min(height.start,height.end);
                if(min<=i&&i<max)
                    tmp++;
            }
            count = Math.max(count,tmp);
        }

스위핑 알고리즘을 적용할 경우 O(n+m)의 시간 복잡도로 문제 해결이 가능하다.

	for (Pos height : heights) {
                int max = Math.max(height.start,height.end);
                int min = Math.min(height.start,height.end);
                CountX[max]--;
        		CountX[min]++;
        }
	for (int i = 1; i < CountX.length; i++) {
            CountX[i]+=CountX[i-1];
            CountY[i]+=CountY[i-1];
        }

해당 알고리즘을 사용한 문제 풀이

https://suhanlim.tistory.com/249

 

'PS > Algorithm' 카테고리의 다른 글

(Prime Number)소수 판별법, 에라토스테네스의 체 (Java)  (0) 2023.08.14

+ Recent posts