[Leetcode] 2974. 최소 숫자 게임.java

김엄지·2024년 5월 24일

알고리즘

목록 보기
87/90

1. 문제

문제 설명

짝수 길이 의 0 인덱스 정수 배열이 제공되며 빈 배열도 있습니다 . 앨리스와 밥은 매 라운드마다 앨리스와 밥이 한 번씩만 움직이는 게임을 하기로 결정했습니다. 게임의 규칙은 다음과 같습니다.numsarr

  • 매 라운드마다 먼저 Alice가 에서 최소 요소를 제거하고 numsBob도 동일한 작업을 수행합니다.
  • 이제 먼저 Bob이 제거된 요소를 배열에 추가 arr하고 Alice도 동일한 작업을 수행합니다.
  • 게임은 nums비어 있을 때까지 계속됩니다.

결과 배열을 반환합니다 arr.

제한사항

  • 2 <= nums.length <= 100
  • 1 <= nums[i] <= 100
  • nums.length % 2 == 0

입출력의 예

예시1
입력: nums = [5,4,2,3]
출력: [3,2,5,4]
설명: 1라운드에서 먼저 Alice가 2를 제거하고 Bob이 3을 제거합니다. 그런 다음 arr에서 Bob이 먼저 3을 추가하고 그 다음 Alice가 추가합니다. 2를 추가합니다. 따라서 arr = [3,2]입니다.
두 번째 라운드 시작 시 nums = [5,4]입니다. 이제 먼저 Alice가 4를 제거하고 Bob이 5를 제거합니다. 그런 다음 둘 다 arr에 추가되어 [3,2,5,4]가 됩니다.

예시2
입력: nums = [2,5]
출력: [5,2]
설명: 1라운드에서 먼저 Alice가 2를 제거한 다음 Bob이 5를 제거합니다. 그런 다음 arr에서 먼저 Bob이 추가하고 그 다음 Alice가 추가합니다. 따라서 arr = [5,2]입니다.


2. 풀이 과정

  1. 주어진 배열을 동적으로 크기 조절할 수 있는 ArrayList로 변환한다.
  2. while문으로 numList가 비어있지 않을 때까지 반복하여 결과를 지정할 배열 result에 저장한다.
  3. 최소 요소 인텍스를 찾는 코드는 Alice와 Bob 공통이라서 메서드를 이용한다.
  4. Alice가 최소 요소를 배열 numList에서 제거하고 변수 aliceValue에 저장한다.
  5. Bob도 위와 풀이 동일
  6. 결과를 지정할 배열 result에 문제에 제시한 순서에 맞게 값을 추가한다.
  7. 결과 배열을 int 배열로 변환해서 반환한다.

3. 최종 코드

class Solution {
    public int[] numberGame(int[] nums) {

        // 주어진 배열을 ArrayList 변환
        ArrayList<Integer> numList = new ArrayList<>();
        for (int num : nums) {
            numList.add(num);
        }

        // 결과를 지정할 배열
        ArrayList<Integer> result = new ArrayList<>();

        // 배열이 비어있지 않을 때까지 반복
        while (!numList.isEmpty()) {
            
            // Alice가 최소 요소 제거 및 추가
            int minIndex = getMinIndex(numList);
            int aliceValue = numList.remove(minIndex);

            // 배열이 비어있다면 bob의 차례 생략
            if (numList.isEmpty()) {
                result.add(aliceValue);
                break;
            }

            // bob이 최소 요소 제거 및 추가
            minIndex = getMinIndex(numList);
            int bobValue = numList.remove(minIndex);

            // bob이 먼저 arr에 추가하고, 그 다음 alice가 추가
            result.add(bobValue);
            result.add(aliceValue);
        }

        // 결과 배열을 int 배열로 변환해서 반환
        int[] resultArr = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            resultArr[i] = result.get(i);
        }

        return resultArr;
    }

    // 최소 요소 인텍스를 찾는 메서드
    private static int getMinIndex(ArrayList<Integer> list) {
        int minIndex = 0;
        for (int i = 1; i < list.size(); i++) {
            if (list.get(i) < list.get(minIndex)) {
                minIndex = i;
            }
        }
        return minIndex;
    }
}

4. 공부 내용

배열(Array)와 리스트(ArrayList)의 차이

배열(Array)

  • 고정된 크기를 가지며, 크기를 변경할 수 없다.
  • 요소 접근이 빠르지만, 요소를 추가/제거 작업이 비효율적일 수 있다.

ArrayList

  • 동적으로 크기를 변경할 수 있다.
  • 요소를 추가/제거가 상대적으로 편리하다.
  • 내부적으로 배열을 사용하지만, 크기 변경 작업을 효율적으로 처리한다.

    ArrayList 메서드
    add, remove, size, get 메서드를 활용

반복문 이용

  • 배열에서 최소값을 찾아내는 방법을 이해할 수 있었다.
  • 배열이 비어 있을 때지 사용 방법을 익힐 수 있었다.

마무리

반복문으로 배열이 빌 때까지 안의 코드를 수행되도록 작성하는 방법이 익숙해지려면 많이 노력해야 겠다. 그래도 공통적으로 사용하는 코드는 메서드로 빼는 것은 익숙해진 듯하다. 내가 익숙해지는 범위가 많아질 수록 공부가 확장될 수 있다는 점들이 너무 두근거린다 ! 이렇게 오늘도 한 걸음 내딛기 성공 😊👍

profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글