📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• 그리디 (스케줄링)
2차원 int형 배열 targets를 끝나는 시간 기준 오름차순 정렬한다.
끝나는 시간이 같다면, 시작 시간 기준 오름차순 정렬한다.
정렬된 배열을 반복문으로 돌면서 "현재 시점의 시작 위치 ≥요격 시스템의 마지막 위치 (end)"인 경우,
요격 시스템의 마지막 위치를 현재 시점의 종료 위치로 갱신하고 정답 + 1한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import java.util.*;
class Solution {
public int solution(int[][] targets) {
int answer = 0;
// 끝나는 시간 기준 오름차순 정렬. (끝나는 시간 같으면 시작 시간 기준 오름차순 정렬)
Arrays.sort(targets, (o1, o2) -> {
if(o1[1] == o2[1])
return o1[0] - o2[0];
return o1[1] - o2[1];
});
int end = targets[0][1];
answer++; // 첫 번째로 만들어지는 요격 시스템
for(int[] t : targets) {
if(t[0] >= end) { // 요격시스템의 상한보다 오른쪽에 있다면, 새 요격 시스템 추가
end = t[1];
answer++;
}
}
return answer;
}
}
|
cs |
➕ 다른 풀이 방식
- 정렬 방법 : 다양하게 작성할 수 있다.
Arrays.sort(targets, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[1], o2[1]);
}
});
- 다른 접근 방식1) x좌표 기준 오름차순 정렬하고 푸셨다.
import java.util.*;
class Solution {
public int solution(int[][] targets) {
Arrays.sort(targets, (a, b) -> a[0] - b[0]); // x좌표 기준 정렬
int cnt = 0;
int last = -1;
for (int[] t : targets) {
if (t[0] > last) { // 새로운 요격 미사일 필요
cnt++;
last = t[1] - 1; // 해당 미사일로 커버되는 범위
}
else if (t[1] - 1 < last) { // 더 작은 범위로 커버 가능한 미사일 필요
last = t[1] - 1; // 해당 미사일로 커버되는 범위
}
}
return cnt;
}
}
- 다른 접근 방식2) 끝나는 구간 기준 오름차순 정렬하셨다.
[프로그래머스] 요격 시스템 JAVA
문제링크끝나는 구간을 오름차순으로 정렬하고, 한 범위에 대해서 최대한 뒤쪽에 요격 하면 이후의 범위에 최대한 들 수 있다.양쪽이 개구간이라는 것이 유의할 점이다.
velog.io
💦 어려웠던 점
1. 그리디 문제인 줄은 알았는데 어떤 기준으로 정렬할지 고민하고,, 이러다가 시간 내에 해결책이 나지 않아 다른 분 풀이를 보았다.
2. 미사인 구간을 동적으로 잘 설정하는 것
🧐 새로 알게 된 내용
1. 그리디 문제는 정렬이 중요한 문제가 많구나... 시작이든 끝이든 기준을 하나 잡아 오름차순 정렬하고 그에 따라 코드를 작성하면 된다고 한다!!
2. 시작 구간은 최대, 끝 구간은 최소인 구간으로 잡아야 한다고 한다.
[프로그래머스] 요격 시스템 Lv2 JAVA [그리디][엄탱]
문제 링크 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.
tang25.tistory.com
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 240213 |
(참고)
✔ 풀이 참고
프로그래머스 - 요격 시스템(Java)
그리디 문제입니다. 문제를 요약하면 다음과 같습니다. 여러 개의 직선이 주어질 때, 모든 선을 지나도록 하는 최소 직선의 개수를 구하라 문제에서 주어지는 예제는 다음과 같습니다. 주어지는
ksb-dev.tistory.com
- 비슷한 문제라고 합니당,,
1931번: 회의실 배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Lv. 2] 호텔 대실 (JAVA) (0) | 2024.01.13 |
---|---|
[프로그래머스/Level2] 택배 배달과 수거하기 (JAVA) (0) | 2024.01.07 |
[프로그래머스/Lv. 3] 가장 긴 팰린드롬 (JAVA) (0) | 2023.11.29 |
[프로그래머스/Lv. 2] 택배상자 (JAVA) (0) | 2023.11.26 |
[프로그래머스/Lv. 2] [1차] 뉴스 클러스터링 (JAVA) (0) | 2023.11.26 |