문제 설명

라이프 수치가 적혀있는 카드 뭉치로 게임을 하려고 합니다.

각 카드의 라이프 수치는 cards에 정수 배열로 주어집니다.

게임 규칙은 다음과 같습니다.

   · 두 명의 참가자가 카드 뭉치에서 라이프가 가장 높은 카드 한 장씩 뽑습니다.

   · 서로 뽑은 카드의 라이프 수치를 갖고 겨룹니다.

   · 겨루는 규칙은 다음과 같습니다. 카드의 라이프 수치가 각 x와 y라고 가정합니다.

   · 만약 x == y이면, 두 카드 모두 소멸합니다.

   · 만약 x > y이면, y 카드는 소멸하고 x 카드는 라이프가 y만큼 차감된 후 카드 뭉치로 넣습니다.

   · y > x일 경우, 위와 반대로 x 카드가 소멸하고 y 카드는 라이프가 x만큼 차감된 후 카드 뭉치로 넣습니다.

 

이 게임을 계속 진행하다가 마지막에 카드 뭉치에 남은 카드의 라이프 수치를 출력하는 프로그램을 구현하세요.


입력 형식

· cards : 카드의 라이프 수치가 적힌 정수 배열


출력 형식

· 마지막에 남은 카드의 라이프 수치를 정수로 반환


제약 사항

· 0 <= cards.length <= 100

· 1 <= cards[i] <= 100


입출력 예시

· 입력

  · cards = {4, 8, 6, 1, 2}

· 출력 : 1

· 설명 : 아래와 같은 순서로 게임이 진행된다.

  · 8과 6을 뽑아, 라이프 2인 카드가 되어 카드뭉치는 {4, 1, 2, 2}가 된다.

  · 4와 2를 뽑아, 라이프 2인 카드가 되어 카드뭉치는 {1, 2, 2}가 된다.

  · 2와 2를 뽑아, 두 카드가 소멸하고 카드뭉치는 {1}이 된다.


작성 코드

import java.util.Collections;
import java.util.PriorityQueue;

class Solution253 {
    public int solution(int[] cards) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        // 우선순위 큐를 이용하여 카드 뭉치를 내림차순으로 정렬합니다.
        for (int c : cards) {
            pq.offer(c);
        }
        while (pq.size() > 1) {
            int x = pq.poll();
            int y = pq.poll();
            if (x == y) {
                // 두 카드가 같은 경우, 둘 다 소멸합니다.
                continue;
            } else if (x > y) {
                // a 카드가 이긴 경우, b 카드를 소멸시키고 a-b 카드를 다시 뭉치에 넣습니다.
                pq.offer(x - y);
            } else {
                // b 카드가 이긴 경우, a 카드를 소멸시키고 b-a 카드를 다시 뭉치에 넣습니다.
                pq.offer(y - x);
            }
        }
        // 마지막으로 남은 카드 라이프 수치를 반환합니다.
        return pq.isEmpty() ? 0 : pq.poll();
    }

    public static void main(String[] args) {
        Solution253 st = new Solution253();
        int[] cards = {4, 8, 6, 1, 2};
        System.out.println(st.solution(cards));
    }
}

 

정답 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

class Solution {
    public int solution(int[] cards) {
        List<Integer> cardList = new ArrayList<>();
        cardList.addAll(Arrays.stream(cards)
                .boxed()
                .collect(Collectors.toList()));

        while (cardList.size() > 1) {
            cardList.sort(Comparator.naturalOrder());
            battle(cardList);
        }
        return cardList.size() == 1 ? cardList.get(0) : 0;
    }

    void battle(List<Integer> cardList) {
        int life1 = cardList.remove(cardList.size() - 1);
        int life2 = cardList.remove(cardList.size() - 1);

        int leftLife = Math.abs(life1 - life2);
        if (leftLife > 0) {
            cardList.add(leftLife);
        }
    }

    public static void main(String[] args) {
        Solution st = new Solution();
        int[] cards = {4, 8, 6, 1, 2};
        System.out.println(st.solution(cards));
    }
}