프로그래머스 | 라이프 수치 게임

chaen·2024년 3월 2일
post-thumbnail

📌 문제

라이프 수치가 적혀있는 가드 뭉치로 게임을 하려고 합니다. 각 카드의 라이프 수치는 cards에 정수 배열로 주어집니다. 게임 규칙은 다음과 같습니다.

  • 두 명은 참가자가 카드 뭉치에서 라이프가 가장 높은 카드 한 장씩 뽑습니다.
  • 서로 뽑은 카드의 라이프 수치를 갖고 겨룹니다.
  • 겨루는 규칙은 다음과 같습니다. 카드의 라이프 수치와 각 xy라고 가정합니다.
  • 만약 x == y이면, 두 카드 모두 소멸합니다.
  • 만약 x < y이면, y 카드는 소멸하고 x 카드는 라이프가 y만큼 차감된 후 카드 뭉치로 넣습니다.
  • y < x일 경우, 위와 반대로 x 카드가 소멸하고 y 카드는 라이프가 x 만큼 차감될 후 카드 뭉치로 넣습니다.

이 게임을 계속 진행하다가 마지막에 카드 뭉치에 남은 카드의 라이프 수치를 출력하는 프로그램을 구현하세요. 단, 마지막에 모든 카드가 소멸되는 경우에는 0을 반환하세요.

입출력 예

  • 입력 : cards = {4, 8, 6, 1, 2}
  • 출력 : 1
  • 설명 : 아래와 같은 순서로 게임이 진행된다.
  • 8과 6을 뽑아, 라이프 2인 카드가 되어 카드 뭉치는 {4, 1, 2, 2}가 된다.
  • 4와 2를 뽑아, 라이프 2인 카드가 되어 카드 뭉치는 {1, 2, 2}가 된다.
  • 2와 2를 뽑아, 두 카드가 소멸하고 카드 뭉치는 {1} 이 된다.

✨ 해결 방법

while문을 사용하여 cards에 요소가 2개 이상 남을 때까지만 반복합니다.
우선 편리성을 위해 배열을 내림차순으로 정렬합니다. 이 후 가장 큰 숫자 두개를 뽑아야 하므로 차례대로 pop()한 결과를 변수에 대입하고, 두 숫자의 차를 구해 다시 배열에 넣습니다. 만약 같다면 그냥 소멸하므로 뽑기만 하고 더 진행하지 않습니다.

만약 다 돌았을 때 배열에 1가지 요소가 남아있다면 그 요소를 반환하고, 아무것도 없다면 0을 반환합니다.

💻 solution

function solution(n) {
    while (n.length > 1){
        n.sort((a, b) => a - b );
        const x = n.pop();
        const y = n.pop();

        if( x - y !== 0){
            const sum = Math.abs(x - y);
            n.push(sum);
        }
    }
    return n.length > 0 ? n[0] : 0;
}

0개의 댓글