본문 바로가기
알고리즘/문제 풀이

프로그래머스: 요격 시스템(lv2)

by 위대한초밥V 2023. 6. 12.

- 문제: https://school.programmers.co.kr/learn/courses/30/lessons/181188

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

설명

  • 끝나는 구간을 오름차순으로 정렬하고, 범위에 대해 가장 뒤쪽에 요격하여 범위의 최대를 확인한다.
  • target 구간을 순회하면서, last가 두 구간 사이라면 무시해도 되므로 다음 구간으로 넘어간다. 

 

왜? 시작 지점 정렬은 필요하지 않는가

어차피! target 구간은 순회하면서 last가 두 구간 사이인지 아닌지만 확인하기 때문이다.

우리의 목표는 last(현재 요격 범위의 마지막 지점)를 기준으로 업데이트해나가는 것이다.

 

정렬에서 사용한 Java Lamda 함수 이해하기

람다 표현식은 화살표(->) 기호를 이용하여 표현할 수 있다.

(매개변수목록) -> {함수몸체}

 

람다 표현식 작성 시, 유의할 점

  1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.
  2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있다.
  3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있다. 이때 세미콜론(;)은 붙이지 않는다.
  4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없다.
  5. return 문 대신 표현식을 사용할 수 있고, 이때 반환값은 표현식의 결과값이 된다.
new Thread(new Runnable() {
	public void run() {
    	System.out.println("전통적인 방식의 일회용 스레드 생성");
	}  
}).start();    
    
new Thread(()->{
	System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();

 

lamda로 정렬한 코드를 이해하자.

Arrays.sort(targets, (o1, o2) -> o1[1] - o2[1]);

 

sort 함수는 기본 타임의 두번째 배열에 정렬 방식을 넣어준다. 

정렬은 오름차순으로 수행된다.

두번째 요소가 가장 작은 배열이 가장 먼저 위치하고, 그 다음으로 두번째로 작은 요소를 가진 배열이 위치하게 된다. 

 

+) 더불어 o1, o2의 첫번째 원소를 기준으로 개선하고, 만약 첫번째 원소 값이 같다면 두번째 원소를 가지고 하는 방법은 다음과 같다.

Arrays.sort(targets, (o1, o2) -> {
	if(o1[0] != o2[0]) {
    	return o1[0]-o2[0];
	} else {
    	return o1[1]-o2[1];
	}
});

// 조건 연산자 사용
Arrays.sort(targets, (o1, o2) -> o1[0] != o2[0] ? o1[0] - o2[0] : o1[1] - o2[1]);

 


코드

import java.util.*;

class Solution {
    public int solution(int[][] targets) {
        int answer = 0;
        
        Arrays.sort(targets, (o1, o2) -> {return o1[1]-o2[1];});
               
        int last = -1;
        for (int[] target : targets) {
            if(last == -1) {
                answer++;
                last = target[1] - 1;
                continue;
            }
            
            if(last >= target[0] && last <= target[1]) {
                continue;
            }

            
            answer++;
            last = target[1] -1;
        }
    
        return answer;
    }
}
반응형