문제 설명
라이프 수치가 적혀있는 카드 뭉치로 게임을 하려고 합니다.
각 카드의 라이프 수치는 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));
}
}
'연습 코딩테스트' 카테고리의 다른 글
연습문제 2-5(5) min heap (0) | 2023.04.08 |
---|---|
연습문제 2-5(4) 포화 이진 트리 노드 개수 (0) | 2023.04.08 |
연습문제 2-5(2) 배열에서 n이 나타나는 가장 작은 인덱스 (0) | 2023.04.08 |
연습문제 2-5(1) 단어가 문장의 몇 번째 단어와 일치하는지 (0) | 2023.04.08 |
연습문제 2-4(5) 접두사가 되는 요소의 개수 (0) | 2023.04.08 |