주녘공부일지

[프로그래머스 C#] Lv.2 요격 시스템 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 요격 시스템

주녘 2023. 11. 9. 14:23
728x90

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

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

- 모든 미사일을 요격해야 하는데, 주어진 좌표 범위의 개구간에서만 요격이 가능 (ex. 2-3일 경우, 범위 사이를 요격)

- 받는 데이터를 오름차순 or 내림차순 정렬하여 요격 가능 범위를 설정하고 요격 가능 범위가 줄어드는 조건과 요격 불가능 시 새로운 요격 범위를 지정하여 풀이

 

1. 데이터 정렬

2. 같이 요격이 가능한 미사일인지 순차적으로 체크

 - 요격 범위 축소 조건 체크, 새로운 요격 그룹 추가 조건 체크

 

주석참조 


    using System;
    using System.Collections.Generic;

    public class Solution
    {
        public class DataClass
        {
            public int startPoint;
            public int endPoint;

            public DataClass(int startPoint, int endPoint)
            {
                this.startPoint = startPoint;
                this.endPoint = endPoint;
            }
        }

        public int solution(int[,] targets)
        {
            int answer = 0;
            List<DataClass> list = new List<DataClass>();

            for (int i = 0; i < targets.GetLength(0); i++)
                list.Add(new DataClass(targets[i, 0], targets[i, 1]));

            // 데이터 정렬 (오름차순)
            list.Sort((x, y) => CompareTo(x, y));

            // 초기 값 세팅 (첫 그룹 값 세팅)
            int currEndPoint = int.MaxValue;
            answer++;

            // 같이 요격될 수 있는 그룹인지 순서대로 체크
            for (int i = 0; i < list.Count; i++)
            {
                // 요격 범위 축소
                if (currEndPoint > list[i].endPoint)
                    currEndPoint = list[i].endPoint;

                // 새로운 요격 그룹 추가
                if (currEndPoint <= list[i].startPoint)
                {
                    answer++;
                    currEndPoint = list[i].endPoint;
                }
            }

            return answer;
        }
        
        // 오름차순 정렬 메서드
        public int CompareTo(DataClass x, DataClass y)
        {
            if (x.startPoint == y.startPoint)
                return 0;

            return (x.startPoint > y.startPoint) ? 1 : -1;
        }
    }
728x90