본문 바로가기
Programmers/Lv.2

[프로그래머스] Lv.2 요격시스템 JAVA 풀이

by Poorm 푸름 2023. 8. 28.

문제 Lv.2 요격시스템

:  여러 개구간 x좌표가 있다

   이들을 모두 한번씩 관통해야 한다

   최소한으로 쏠 수 있도록 최대한 겹쳐 미사일을 쏜다

 


▶ targets = [ 1, 4 ], [ 3, 7 ], [ 4, 5 ], [ 4, 8 ], [ 5, 12 ], [ 10, 14 ], [ 11, 13 ] 

 

targets 는 미사일 좌표 범위

   좌표는 x좌표로만 이루어져 있고 [s,e] 로 표현 가능

   이때, [s,e]는 개구간이다 (즉, 시작지점과 끝지점 미포함)

 

 [문제 방식]

1. 끝지점을 기준으로 잡아서 오름차순으로 정렬하고 시작

2. 현재 구간의 끝지점과 다음 타겟의 시작점이 겹치지 않는 순간 count

    더 이상 겹칠게 없기 때문에 다음 좌표들의 미사일 쏘고 구간 계산

    (이해중요! 일단은 미사일 먼저 쏴놓고 구간 계산 하는 것)

 

[EX]                                        현재 내가 보고있는 좌표 [1,3], 새롭게 들어올 타겟 좌표 [2,4] 일 때

         ------------                       끝지점인 3이 다가오기 전에 새롭게 들어온 시작지점 2는 서로 겹치기 때문에

-------------       -------               뒤에 또 겹칠 타겟이 있을 수도 있으므로 아직은 카운트 하지 않는다

1      2     3      4      5              다음 타겟 [4,5]의 시작지점 4를 보고 더 이상 겹치는 것이 없음을 확인
                                                그때 미사일 [4,5] 사이에 쏠 미사일 1발을 count

 

<여기서, 의문점>     

 

그렇다면 [1,3]과 [2,4] 사이에 쏠 미사일은 언제 count 하는거죠?


일단 미리 미사일을 먼저 쏘고 구간을 계산하는 방식이므로

아래 코드를 보면 알겠지만 맨처음 끝지점을 0으로 초기화해서

무조건 count 하고 시작할 수 있게끔 설정한다 

 

[알고 가야할 함수]

 

-  Array.sort 2차원 배열 정렬

  (2차원 배열인 [ A, B ] 에서 A는 0번째 B는 1번째라고 표현가능)

 
 (EX)          arr =  [ 5, 40 ],4, 20 ], [ 1, 30 ] 라면

-  (o1, o2) -> o1[0]-o2[0]   :  0번째 숫자 기준 오름차순   ▶ [ 1, 30 ] - [ 4, 20 ] - [ 5, 40 ] 

-  (o1, o2) -> o2[0]-o1[0]   :  0번째 숫자 기준 내림차순    [ 5, 40 ] - [ 4, 20 ] - [ 1, 30 ]   

(o1, o2) -> o1[1]-o2[1]   :  1번째 숫자 기준 오름차순   [ 4, 20 ] - [ 1, 30 ] - [ 5, 40 ] 

-  (o1, o2) -> o2[1]-o1[1]   :  1번째 숫자 기준 내림차순    [ 5, 40 ] - [ 1, 30 ] - [ 4, 20 ]

 

 [코드]

import java.util.*;
class Solution {
    public int solution(int[][] targets) {
        int result = 0;
        int now = 0;
        Arrays.sort(targets, (o1, o2) -> o1[1]-o2[1]);
        for(int i=0; i<targets.length; i++) {
        	if(targets[i][0] >= now) {
        		now = targets[i][1];
        		result++;
        	}
        }
        return result;
    }
}

       

:   int result = 0;  결과로 출력할 result 지정

    int now;  현재 좌표

        
:   Arrays.sort(targets, (o1, o2) -> o1[1]-o2[1]);  1번째 자리(끝지점) 숫자 기준으로 오름차순 정렬

 

:  for(int i=0 ; i<targets.length ; i++) {  targets 개수 만큼 반복
           if(targets[i][0] >= now) {  0번째 열을 행 바꿔가며 비교 (즉 시작지점만 비교) 

                                                  현재 좌표의 끝지점과 다음 올 targets 좌표의 시작지점을 비교
                                                  끝지점 보다 시작지점이 더 크면 그때는 더이상 겹치는 부분이 없기 때문에
                                                  미사일 쏘고 다음 타겟으로 넘어간다

                now = targets[i][1];    1번째 열을 행 바꿔가며 비교 (즉 끝지점만 비교) 

                                                   카운트 될 때마다 비교대상 now도 새롭게 갱신

                result++;  결과 카운트

           }                                       
   }                                               
        
:  return result;  결과 출력

 

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *