greenkang
그린 개발log
greenkang
전체 방문자
오늘
어제
  • 분류 전체보기 (28)
    • 알고리즘 (20)
    • MySQL (0)
    • 생각 (0)
    • 컴퓨터구조 (6)
    • Spring · SpringBoot (1)
    • Java (1)
    • 장애 대응 회고 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • python
  • 프로그래머스 거리두기 자바
  • 장애 대응 회고
  • java
  • 백준
  • 알고리즘
  • 파이썬
  • 프로그래머스 거리두기 java
  • 백준 1065번 자바
  • TOPCODER알고리즘트레이닝
  • 백준7569 java
  • 41. First Missing Positive
  • 백준7569
  • 리트코드
  • 어셈블리어
  • 자바
  • 컴퓨터구조
  • 프로그래머스
  • 백준 24479번 자바
  • 백준 17265번

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
greenkang

그린 개발log

알고리즘

[프로그래머스] 요격 시스템

2023. 5. 7. 23:23

프로그래머스_요격시스템 Level2

 

프로그래머스

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

programmers.co.kr


초기 풀이 방법 (통과 ❌)

  • targets의 값끼리 중복되는 최소 구간을 저장하기 위해 duplRangeList 생성
  • targets의 값을 하나 씩 확인하며 duplRangeList와 겹치는 구간이 있으면 최소 구간으로 갱신
  • duplRangeList와 겹치는 구간이 없으면 target값을 duplRangeList에 추가
  • 최종적으로 duplRangeList의 길이 반환

 

초기 풀이 방법 코드(통과 ❌)

import java.util.ArrayList;

class Solution {
    
    public int solution(int[][] targets) {
        
        
        ArrayList<int[]> duplRangeList = new ArrayList<>();
        
        for (int[] target: targets) {
            
            int s = target[0], e = target[1];
            
            boolean isDupl = false;
            for (int[] duplRange: duplRangeList) {
                
                if ( (e <= duplRange[0]) || (s >= duplRange[1]) )   continue;
                
                // 겹치는 구간이 있을 경우 최소구간으로 업데이트
                isDupl = true;
                duplRange[0] = Math.max(s, duplRange[0]);
                duplRange[1] = Math.min(e, duplRange[1]);

                break;
            }
            
            if (isDupl)   continue;
            
            // 겹치는 구간이 없을 경우 중복구간 리스트에 target 추가
            duplRangeList.add(target);    
        }
        
        
        return duplRangeList.size();
    }
}

 

자바 배열 정렬 메서드 Arrays.sort() 을 사용하면 평균 : O(nlog(n)) / 최악 : O(n^2) 의 시간복잡도를 갖는다.

target의 최대 길이가 500,000으로 작지 않은 편이기 때문에 최악의 시간복잡도를 생각해서 정렬을 쓰고 싶지 않았다.

 

물론 풀다보니 이 코드도 for문 안에 for문이 있기 때문에 최악의 경우 O(n^2)의 시간복잡도를 갖지만..

초기에는 시간복잡도를 생각해서 정렬 메서드를 사용하기 싫었다(이유 없는 고집)

 

이 풀이는 총 11개의 테스트 케이스 중 4개만 통과했고, 아직까지 반례를 찾지 못했다😰.

반례를 알고계시는 분 댓글 부탁드립니다..!

 


 

정렬을 사용한 풀이 방법 (통과 ⭕)

target의 가장 마지막 구간에서 요격 한다고 생각!

  • 각 targets값의 두 번째값을 기준으로 오름차순 정렬 
  • targets을 반복 하며
  • 현재 target의 시작 값과 현재 미사일을 발사하는 최대위치(사실 개구간이라 포함되지는 않는다)를 비교
  • target의 시작 값 > 미사일을 발사하는 최대위치 : 범위에 포함되므로 또 다른 미사일을 더 발사하지 않아도 됨 -> 미사일 개수 그대로
  • target의 시작 값 <= 미사일을 발사하는 최대위치 : 범위에 포함되지 않으므로 미사일을 더 발사해야함 -> 미사일 개수 + 1
  • 발사한 미사일 개수 return

 

정렬을 사용한 풀이 코드(통과 ⭕)

import java.util.Arrays;

class Solution {
    public int solution(int[][] targets) {
        
        // targets 값들의 2번재 인자 값을 기준으로 오름차순 정렬
        Arrays.sort(targets, (o1, o2) -> {  return  o1[1] - o2[1];  });
        
        
        int missileCnt  = 0;  // 현재까지 요격에 사용된 미사일 개수
        int maxShotVal  = -1; // 미사일 발사 위치 최대값 (개구간이라 포함은 되지 않음)
        for (int[] target: targets) {
            
            if (target[0] < maxShotVal) continue;
            
            missileCnt++;
            maxShotVal = target[1];
            
        }
        
        
        return missileCnt;
    }
}

 

'알고리즘' 카테고리의 다른 글

[TOPCODER 05.전체탐색] 09. 마법의 숫자  (0) 2022.10.23
[TOPCODER 알고리즘 트레이닝] 07. 고장난 로봇  (0) 2022.08.29
[프로그래머스] 다리를 지나는 트럭  (0) 2022.08.08
[백준] 1065번 한수  (0) 2022.07.30
[백준] 24479번 알고리즘 수업 - 깊이 우선 탐색 1  (0) 2022.07.26
    '알고리즘' 카테고리의 다른 글
    • [TOPCODER 05.전체탐색] 09. 마법의 숫자
    • [TOPCODER 알고리즘 트레이닝] 07. 고장난 로봇
    • [프로그래머스] 다리를 지나는 트럭
    • [백준] 1065번 한수
    greenkang
    greenkang

    티스토리툴바