Level0 - 겹치는 선분의 길이

2024. 7. 18. 16:49·알고리즘/프로그래머스

✅ 문제 설명

선분 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, 끝점: -1
  2. 이벤트 리스트를 좌표 순으로 정렬한다. 좌표가 같을 경우 끝점이 시작점보다 앞에 오도록 정렬한다.
  3. `overlapping` 변수는 현재 겹치는 선분의 개수를 추적한다.
  4. `previousPoint`는 이전 이벤트의 좌표를 저장한다.
  5. 이벤트를 순회하면서 2개 이상의 선분이 겹치는 구간의 길이를 계산한다.
  6. 현재 이벤트 좌표에서 이전 이벤트의 좌표를 빼서 구간의 길이를 구한 뒤 `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
'알고리즘/프로그래머스' 카테고리의 다른 글
  • Level1 - 옹알이 (2)
  • Level1 - [1차] 비밀지도
  • Level0 - 안전지대
  • 코딩 기초 트레이닝 9
요술공주밍키
요술공주밍키
조금씩이라도 꾸준히..
  • 요술공주밍키
    삽질의흔적
    요술공주밍키
  • 전체
    오늘
    어제
    • 분류 전체보기 (139)
      • Java (42)
        • Spring Boot (14)
        • Spring Boot 게시판 (14)
        • 공중화장실 찾기 (4)
        • 쇼핑몰 (8)
      • JavaScript (8)
        • NodeJS (2)
      • Python (5)
        • Django (4)
      • Server (10)
        • Docker (4)
        • K8S (0)
        • Jenkins (1)
      • 알고리즘 (24)
        • 프로그래머스 (19)
        • 백준 (5)
      • Etc (21)
        • 개발 팁 (1)
      • 일상 (27)
        • 독서 포스트 (25)
        • 회고록 (2)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
요술공주밍키
Level0 - 겹치는 선분의 길이
상단으로

티스토리툴바