본문 바로가기
일반 학습/코딩 테스트

우선권에 따라 선수 데려가기

by StelthPark 2022. 3. 27.

조건

powers로 각 선수들의 힘(1<= n <=9)가 들어 있는 배열이 주어지고 ticket(1<=n<=?)로 우선권의 갯수가 들어온다. 상대방과 나는이 powers 배열에서 돌아가며 선수들을 자기팀으로 데려갈 것인데, 무조건 상대방이 먼저 고를 수 있다. 하지만 내가 우선권 ticket가 있다면 1개를 사용하여 상대방 보다 해당 뽑을 차례에서 먼저 뽑을 기회를 얻을 수 있다. 여기서 내가 뽑은 선수들의 힘 합이 가능 높게 나오는 선수 배열을 리턴하라.

 

입력 : solution([2, 2, 2, 8, 6, 6, 6, 1, 9, 1, 1, 9, 9], 3);

 

풀이

문제를 해석해본다면 어빌리티 배열안에 들어 있는 선수들의 힘을 내림차순으로 정렬해보자.

[9, 9, 9, 8, 6, 6, 6, 2, 2, 2, 1, 1, 1] 이렇게 될 것이고 상대방과 내가 뽑으면 선수는 2명씩 사라지게 되므로 한번 뽑고나면 인덱스를 2칸씩 올리면 될 것이다. i와 i+1이 같다면 i와 i+1를 각각 상대방선수배열과 내 선수배열에 담아준다. 만약 다르다면 ticket의 갯수가 0이상인지 확인 한 다음에 0이상 일시 내 선수배열에 i를 상대방 선수배열에 i+1를 넣어준다. 그리고 ticket를 --해준다. 만약 0보다 작거나 같으면 우선권이 없으니 기존 처럼 i와 i+1를 상대방과 내 배열에 푸시한다.

 

결과로 내 선수배열에 undefined가 존재 할 수있다. 우선권 k를 다쓴 상태에서 마지막에 남은 i를 검사할때 i+1은 없을 수 있기 때문이다. undefined를 제외하고 더 한다.

 

function solution(powers, ticket) {
  let my = [];
  let any = [];
  powers.sort(function (a, b) {
    if (a > b) return -1;
    if (a === b) return 0;
    if (a < b) return 1;
  });

  for (let i = 0; i < powers.length; i = i + 2) {
    if (powers[i] === powers[i + 1]) {
      any.push(powers[i]);
      my.push(powers[i + 1]);
    } else if (powers[i] !== powers[i + 1]) {
      if (ticket > 0) {
        my.push(powers[i]);
        any.push(powers[i + 1]);
        ticket--;
      } else if (ticket <= 0) {
        any.push(powers[i]);
        my.push(powers[i + 1]);
      }
    }
  }

  let result = my.reduce((a, b) => {
    if (b !== undefined) {
      return a + b;
    } else {
      return a;
    }
  });
 return result;
}

 

 

댓글