본문 바로가기
알고리즘/알고리즘 설명

20230709 [Java] 문제풀이

by JayAlex07 2023. 7. 9.

20230709 [Java] 문제풀이

 

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

 

미사일이 떨어지는 개구간이 targets라는 2차원 배열로 주어진다

 

이 미사일을 요격하기 위해, 필요한 요격 미사일의 개수의 최솟값을 구하는 것이다

 

일단 각 미사일의 개구간 중, 끝 부분을 기준으로 오름차순으로 정렬을 한다

 

그렇게 정렬을 하고 난 후에, 현재 공격 받는 미사일의 개구간의 시작점과, 그 전의 공격 받았던 미사일의 개구간의 마지막 지점이 완전히 겹치면, 한번에 요격을 할 수 있다

  • [3, 6] , [4, 7] : 두 미사일을 한번에 요격할 수 있음
  • [3, 6], [6, 8] : 두 미사일을 요격하려면 두 개의 요격 미사일이 필요함
  • [3, 6], [7, 9] : 두 미사일을 요격하려면 두 개의 요격 미사일이 필요함

 

// ==== 내 첫 풀이 =====
import java.util.*;

class MTarget {
    int from;
    int to;

    MTarget(int from, int to) {
        this.from = from;
        this.to = to;
    }
}

class Solution {
    public int solution(int[][] targets) {
        int answer = 1;

        ArrayList<MTarget> targetList = new ArrayList<MTarget>();

        for (int[] t : targets) targetList.add(new MTarget(t[0], t[1]));

        Collections.sort(targetList, (MTarget t1, MTarget t2) -> t1.to > t2.to ? 1:-1);

        int attackTo = targetList.get(0).to;

        for (int i = 1; i < targetList.size(); i++) {
            int attackFrom = targetList.get(i).from;

            if (attackFrom >= attackTo) {
                answer ++;
                attackTo = targetList.get(i).to;
            }
        }

        return answer;
    }
}

// ==== 두번째 풀이 =====
class Solution {
    public int solution(int[][] targets) {
        int answer = 1;
        
        // target[i][1] 기준으로 정렬을 한다
        Arrays.sort(targets, (t1, t2) -> t1[1] - t2[1]);
        
        int targetTo = targets[0][1];
        
        for (int i = 1; i < targets.length; i ++) {
            int targetFrom = targets[i][0];

            if (targetFrom >= targetTo) {
                targetTo = targets[i][1];
                answer ++;
            }
        }
        
        
        return answer;
    }
}

 

 

[프로그래머스] 연속된 부분 수열의 합

 

배열 안에서, 연속된 숫자들 중 합이 k가 되는 연속된 숫자들의 길이 중, 제일 작은 좌표를 구하는 문제다

 

투 포인터를 통해서 k가 되는 길이를 구한다

  • k가 만들어지면 i, j를 임시적으로 리스트에 저장을 하면 된다

 

그리고 리스트를 순회하면서, 제일 짧은 좌표를 출력하면 된다

import java.util.*;
class Solution {
    public int[] solution(int[] sequence, int k) {
        ArrayList<int[]> answer = new ArrayList<int[]>();

        int i = 0;
        int j = 0;
        int minVal = Integer.MAX_VALUE;
        int tempAdd = sequence[0];

        while (i < sequence.length) {
            if (tempAdd <= k) {
                if (tempAdd == k) {
                    answer.add(new int[]{i, j});
                    minVal = Math.min(minVal, Math.abs(i - j));
                }
                if (j + 1 < sequence.length) {
                    tempAdd += sequence[++j];
                } else {
                    tempAdd -= sequence[i ++];
                }
            } else {
                tempAdd -= sequence[i ++];
            }
        }

        for (int[] numbers : answer) {
            if (numbers[1] - numbers[0] == minVal) {
                return numbers;
            }
        }

        return null;

    }
}

'알고리즘 > 알고리즘 설명' 카테고리의 다른 글

20230714 [Java] 문제풀이  (0) 2023.07.14
20230711 [Java] 문제풀이  (0) 2023.07.11
20230708 [Java] 문제풀이  (0) 2023.07.08
20230707 [Java] 문제풀이  (0) 2023.07.07
20230706 [Java] 문제풀이  (0) 2023.07.06