[2024] day 173. Leetcode 1552. Magnetic Force Between Two Balls

gunny·2024년 6월 20일
0

코딩테스트

목록 보기
487/530

2024년부터 새롭게 다시 시작하는 코딩테스트

2024년 6월 20일 (목)
Leetcode daily problem

1552. Magnetic Force Between Two Balls

https://leetcode.com/problems/magnetic-force-between-two-balls/?envType=daily-question&envId=2024-06-20

Problem

우주 지구 C-137에서 Rick은 두 개의 공을 자신이 새로 발명한 바구니에 넣으면 사이에 특별한 형태의 자기력이 있음을 발견했다. Rick은 n개의 빈 바구니를 가지고 있고, i번째 바구니는 위치[i]에 있고, Morty는 m개의 공을 갖고 있으며 두 공 사이의 최소 자기력이 최대가 되도록 공을 바구니에 분배해야 한다.
x와 y 위치에 있는 서로 다른 두 공 사이의 자기력은 |x - y|이다.

정수 배열 positions과 정수 m이 주어질 때, 필요로 하는 힘을 반환한다.

Solution

greedy, binary search

자석으로 인해 볼 사이에 발생하는 힘을 최대화 하는 문제인데,
특정 위치에 있는 자석들 사이에 최대한 균등하게 힘을 배치하는 것으로 즉, 볼이 주어진 수 만큼 선택해서 두 볼 사이의 최소 거리를 최대화 한다.
두 볼 사이의 최소 거리를 최대화하기 위해 가능한 거리의 값을 이진 탐색으로 찾아내고 이를 그리디 알고리즘과 결합하여 해결한다.

주어진 볼들의 위치의 배열 position을 오름차순으로 정렬하고,
최소길이 1, 최대 길이를 (최대 위치-최소 위치)로 설정한다.
중간 값을 설정하고 이 거리가 유효한지를 판단하여, 유효하면 최소 거리를 중간값+1로 해 더 큰 최소 거리를 탐색하고 유효하지 않은 경우 최대 길이를 중간값-1로 해서 더 작은 최소 길이를 탐색한다.

여기서 유효한 거리 인지 아닌 지를 그리디로 탐색하는데,
현재 최소 거리인 중간값이 유효한지 확인하기 위해서 그리디 방식으로 볼을 배치한다.
첫 번째 볼을 배치해서 다음 볼을 중간값 이상의 거리로 배치해서 확인한다.

Code

class Solution:
    def maxDistance(self, position: List[int], m: int) -> int:
        
        def IsPlacedBall(dist):
            cnt = 1
            prev_pos = position[0]
            
            for i in range(1, len(position)):
                if position[i] - prev_pos >= dist:
                    cnt +=1
                    prev_pos = position[i]
                    
                if cnt == m:
                    return True
                
            return False
        
        
        position.sort()
        l,r = 1, position[-1] - position[0]
        
        while l<=r:
            mid = (l+r)//2
            
            if IsPlacedBall(mid):
                l = mid+1
                
            else:
                r = mid-1
                
        return r

Complexicity

시간 복잡도

주어진 position 배열을 정렬하는 과정에서 O(nlogn) 이 소요되고,
이진 탐색을 하면서 log(max_dist) 가 소요된다. max_dist는 position배열의 -1, 0 번째 인덱스의 합이다.
각 이진 탐색시 마다 볼을 확인하는 함수를 호출하는데 position 배열의 한번 순홰해서 m 개의 공을 배치할 수 있는 지 확인하므로 O(n)이 소요된다.

즉, 전체 시간 복잡도는 이진 탐색을 주축으로 해서 O(n log(max_dist)) 이다.

공간 복잡도

position 배열을 정렬하면서 O(n)의 공간이 필요하고 나머지는 상수 변수를 사용한다.
전체 공간 복잡도는 O(n)이다.

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글