📄 문제
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 함수를 완성해 주세요.
📝 풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> targets) {
// 오름차순 정렬
sort(targets.begin(), targets.end());
int answer = 1;
for(int i = 0; i < targets.size(); ++i)
{
// 최대 요격 e좌표
int last = targets[i][1];
for(; i < targets.size(); ++i)
{
// 다음 위치의 s좌표가 last 이상이라면 함께 요격 불가능
if(targets[i][0] >= last)
{
++answer, --i;
break;
}
// 최대 요격 좌표는 점점 줄어들을 수 있음
last = min(last, targets[i][1]);
}
}
return answer;
}
- 발사 시작 지점을 오름차순하여 해당 위치를 기준으로 두번째 값인 최대값을 기준으로 검사합니다.
- 문제는 단순하지만, 반례를 생각하여 last를 갱신하는데에 신경을 써야 했습니다.
- last의 값보다 다음 값이 크거나 같다면, 함께 요격을 할 수 없는 위치이기에 개수를 1 증가시킵니다.
- last의 값은 점점 줄어들을 수 있습니다. {1, 5}, {2, 3}, {4, 5}라는 예가 있을경우, 두번째 값인 {2, 3}에서 last를 3으로 줄여야 올바른 정답이 나옵니다.
'algorithms (C++)' 카테고리의 다른 글
[C++][프로그래머스] 과제 진행하기 😅 (0) | 2023.10.29 |
---|---|
[C++][프로그래머스] 연속된 부분 수열의 합 🔥 (0) | 2023.10.29 |
[C++][프로그래머스] 완주하지 못한 선수 (0) | 2023.10.26 |
[C++][프로그래머스] 체육복 🔥 (0) | 2023.10.26 |
[C++][프로그래머스] 크레인 인형뽑기 게임 (1) | 2023.10.26 |