[알고리즘] 요격 시스템

package org.example.알고리즘.요격시스템;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Objects;

/**
 * packageName    : org.example.알고리즘.요격시스템
 * fileName       : Solution
 * author         : ipeac
 * date           : 2023-09-25
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2023-09-25        ipeac       최초 생성
 */
public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        //[[4,5],[4,8],[10,14],[11,13],[5,12],[3,7],[1,4]]
        int[][] targets = {{4, 5}, {4, 8}, {10, 14}, {11, 13}, {5, 12}, {3, 7}, {1, 4}};
        System.out.println(solution.solution(targets));
    }
    
    public int solution(int[][] targets) {
        Objects.requireNonNull(targets, "targets is null");
        int answer = 0;
        // 첫번째 원소를 기준으로 오름차순 정렬 수행
        int[][] sortedTargets = Arrays.stream(targets)
                                      .sorted(Comparator.comparingInt((int[] o) -> o[1])
                                                        .thenComparingInt(o -> o[0]))
                                      .toArray(int[][]::new);
        
        int maxRight = sortedTargets[0][1];
        answer++;
        
        for (int[] target : sortedTargets) {
            int curLeft = target[0];
            int curRight = target[1];
            if (maxRight <= curLeft) {
                maxRight = curRight;
                answer++;
            }
        }
        return answer;
    }
}
  • 끝점을 기준으로 오름차순을 수행한다.
  • 배열을 순회한다.
    • 순회한 배열 요소가 (x좌표 1 ~ 4 커버 가능한 미사일) 라면 4이전에 시작하는 미사일은 전부 해당 미사일을 맞추는 레이저로 커버가 가능하다.
    • 이런식으로 로직을 진행시키면 쉽게 해결가능
  • 물론 중간에 maxRight 값을 갱신해야한다는 것을 잊으면 안된다.

Comparator.comparing 메서드 활용

  1. Stream API + Comparator 활용으로 가독성있는 정렬이 가능함.
    1. Person 객체
      public class Person {
          private String name;
          private int age;
          // ... 생성자, getter, setter 생략 ...
      }
    1. age 속성 기준 오름 차순 + age 동일한 경우 두 번째 정렬 기준
      people.sort(Comparator.comparingInt(Person::getAge).thenComparing(Person::getName));
      • thenComparing 으로 가독성좋은 정렬조건을 설정이 가능하다.
      • 물론 내림차순으로 하려면 comparingInt 나 thenComparing 뒤에 reserved(); 를 체이닝 하면 된다.

Uploaded by N2T

'자바 > 알고리즘' 카테고리의 다른 글

[알고리즘] 친구  (0) 2023.10.02
[알고리즘]두 원 사이의 정수쌍  (0) 2023.10.01
[알고리즘] 두 스티커  (0) 2023.09.24
[알고리즘] 생태학  (0) 2023.09.24
[알고리즘] __**주사위 놀이하는 함수**__  (0) 2023.09.23