728x90
✅ 문제 설명
선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해 보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
✅ 제한사항
- lines의 길이 = 3
- lines의 원소의 길이 = 2
- 모든 선분은 길이가 1 이상입니다.
- lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점입니다.
- -100 <= a < b <= 100
✅ 입출력 예
✅ 문제 풀이
문제를 푸는데 시간이 꽤 오래 걸렸다.. 어느 정도 윤곽을 잡았는데 하나씩 나사가 빠져있어 고생을 많이 했던 것 같다.
해당 문제는 스위핑 기법을 통해 문제를 해결하였다.
- 각 선분의 시작점과 끝점을 이벤트로 리스트에 추가한다. 시작점: 1, 끝점: -1
- 이벤트 리스트를 좌표 순으로 정렬한다. 좌표가 같을 경우 끝점이 시작점보다 앞에 오도록 정렬한다.
- `overlapping` 변수는 현재 겹치는 선분의 개수를 추적한다.
- `previousPoint`는 이전 이벤트의 좌표를 저장한다.
- 이벤트를 순회하면서 2개 이상의 선분이 겹치는 구간의 길이를 계산한다.
- 현재 이벤트 좌표에서 이전 이벤트의 좌표를 빼서 구간의 길이를 구한 뒤 `totalLength`에 더한다.
import java.util.*;
class Solution {
public int solution(int[][] lines) {
List<int[]> events = new ArrayList<>();
for (int[] line : lines) {
events.add(new int[] {line[0], 1});
events.add(new int[] {line[1], -1});
}
Collections.sort(events, (a, b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
int overlapping = 0;
int previousPoint = 0;
int totalLength = 0;
for (int[] event : events) {
if (overlapping >= 2) {
totalLength += event[0] - previousPoint;
}
overlapping += event[1];
previousPoint = event[0];
}
return totalLength;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Level1 - 옹알이 (2) (0) | 2024.08.28 |
---|---|
Level1 - [1차] 비밀지도 (0) | 2024.08.15 |
Level0 - 안전지대 (0) | 2024.07.17 |
코딩 기초 트레이닝 9 (1) | 2023.09.18 |
코딩 기초 트레이닝 8 (0) | 2023.09.15 |