조건
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;
}
'일반 학습 > 코딩 테스트' 카테고리의 다른 글
[프로그래머스] 구명보트 (0) | 2022.03.28 |
---|---|
[프로그래머스] 영어 끝말잇기 (0) | 2022.03.28 |
[프로그래머스] 2개 이하로 다른 비트 (0) | 2022.03.25 |
[프로그래머스] 삼각 달팽이 (0) | 2022.03.25 |
[프로그래머스] 피로도 (0) | 2022.03.25 |
댓글