CodingTest

요격 시스템

흑조롱이 2024. 4. 16. 06:01

https://school.programmers.co.kr/learn/courses/30/lessons/181188

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

I. 문제 개요

미사일은 최소로 발사해야 하니까, 가장 많이 겹치는 구간에 발사하는 방향으로 알고리즘을 설계해야 한다.

 

II. 알고리즘 및 풀이

여기에서는 그리디 알고리즘과 정렬을 사용한다.

 

그리디 알고리즘은 현재 상황에서 최선의 선택을 하는 알고리즘이다.

 

1. 정렬

targets.sort(key = lambda x: x[1])

st = 0
ed = 0

 

주어진 폭격미사일들의 끝 구간을 기준으로, 오름차순으로 정렬한다.

 

그러면 끝점을 기준으로, 미사일을 발사할 지 여부를 뒤에서 결정할 수 있다.

 

st, ed 는 구간이 겹치지 않은 폭격미사일의 시작점, 끝점을 담는 변수이다.

 

2. 그리디 탐색

for i in range(len(targets)):
    tgt = targets[i]
    
    if tgt[0] >= ed:    # 현재 폭격미사일의 구간과, 이전에 본 폭격미사일의 구간이 안겹친다면
        ans += 1        # 요격미사일 발사
        ed = tgt[1]     # 현재 보는 폭격미사일 구간의 끝점으로 변경
        # st = tgt[0]
        
return ans

 

이전에 본 폭격 미사일의  끝점(ed)과, 지금 보는 폭격미사일의 시작점(tgt[0])을 비교한다.

 

만약 ed > tgt[0] 이 성립하면, 이전 폭격미사일과 현재 폭격미사일은 구간이 겹치므로, 요격미사일을 별도로 발사하지 않아도 된다.

 

반대로 ed <= tgt[0] 인 경우, 구간이 겹치지 않기에 요격미사일을 한발 더 쏴야 한다.

 

III. 전체 풀이코드

def solution(targets):
    ans = 0
    targets.sort(key = lambda x: x[1])
    
    st = 0
    ed = 0
    
    for i in range(len(targets)):
        tgt = targets[i]
        if tgt[0] >= ed:
            ans += 1
            ed = tgt[1]
            # st = tgt[0]
    
    return ans

 

IV. 결과