티스토리 뷰
문제
https://school.programmers.co.kr/learn/courses/30/lessons/181188
A 나라가 B 나라를 침공하였습니다. B 나라의 대부분의 전략 자원은 아이기스 군사 기지에 집중되어 있기 때문에 A 나라는 B 나라의 아이기스 군사 기지에 융단폭격을 가했습니다.
A 나라의 공격에 대항하여 아이기스 군사 기지에서는 무수히 쏟아지는 폭격 미사일들을 요격하려고 합니다. 이곳에는 백발백중을 자랑하는 요격 시스템이 있지만 운용 비용이 상당하기 때문에 미사일을 최소로 사용해서 모든 폭격 미사일을 요격하려 합니다.
A 나라와 B 나라가 싸우고 있는 이 세계는 2 차원 공간으로 이루어져 있습니다. A 나라가 발사한 폭격 미사일은 x 축에 평행한 직선 형태의 모양이며 개구간을 나타내는 정수 쌍 (s, e) 형태로 표현됩니다. B 나라는 특정 x 좌표에서 y 축에 수평이 되도록 미사일을 발사하며, 발사된 미사일은 해당 x 좌표에 걸쳐있는 모든 폭격 미사일을 관통하여 한 번에 요격할 수 있습니다. 단, 개구간 (s, e)로 표현되는 폭격 미사일은 s와 e에서 발사하는 요격 미사일로는 요격할 수 없습니다. 요격 미사일은 실수인 x 좌표에서도 발사할 수 있습니다.
각 폭격 미사일의 x 좌표 범위 목록 targets이 매개변수로 주어질 때, 모든 폭격 미사일을 요격하기 위해 필요한 요격 미사일 수의 최솟값을 return 하도록 solution 함수를 완성해 주세요.
내 답안
def solution(targets):
targets = sorted(targets, key = lambda x : x[1]) # e 기준 오름차순 정렬
limit = -1
cnt = 0
for target in targets :
if target[0] > limit :
limit = target[1] - 0.1
cnt += 1
return cnt
해설
그래프 탐색 문제만 주궁장창 풀다가 갑자기 다른 유형의 문제를 풀려고 하니까 초반에 살짝 막혔다.
어떻게 풀 지 감만 잡으면 코드 자체는 하나도 어렵지 않다.
이 문제에서 중요한 포인트는 범위가 개구간(양 끝점 포함 X)이라는 건데, 이 부분은 한 미사일당 요격 가능한 영역을 기준치 - 0.1 해줌으로써 해결하였다.
해결 방법은 간단하다
1. e 기준으로 오름차순 정렬
2. 리스트를 순회하면서 아래 기능 수행
2.1. s값이 요격 가능한 최대 영역(limit)보다 작으면 pass(미사일로 사격 가능함)
2.2. s값이 limit 크면 limit 값을 e-0.1으로 재설정하고 cnt + 1
피드백
파이썬 정렬(sorted(리스트), 리스트.sort())
리스트를 정렬할 때 기준을 명시하는 방법 : key = lambda x : 기준
일반적으로 lambda x에서 x는 순회할 리스트의 각 원소를 의미하며 : 기준에는 정렬 기준이 되는 값을 명시한다.
예시 1 : 각 리스트의 원소 기준으로 오름차순 정렬하기(문자열의 경우 사전순 정렬)
sorted([2,5,1,3], key = lambda x : x) # [1, 2, 3, 5]
내림차순 정렬은 기준에 -을 붙여주면 된다. (ex. key = lambda x : -x
)
예시 2 : 각 리스트의 첫 번째 원소 기준으로 오름차순 + 첫 번째 원소가 같다면 두 번째 원소 기준으로 정렬
sorted([[1,4],[1,2],[5,6],[3,5]], key = lambda x : (x[0], x[1])) # [[1, 2], [1, 4], [3, 5], [5, 6]]
'PS > 프로그래머스' 카테고리의 다른 글
프로그래머스 | 과제 진행하기 | 파이썬 풀이 (0) | 2023.08.14 |
---|---|
프로그래머스 | 연속된 부분 수열의 합 | python 풀이 (2) | 2023.08.13 |
프로그래머스 | 두 원 사이의 정수 쌍 | python 풀이 (0) | 2023.08.12 |