프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
* 실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
* N = 전체 스테이지의 개수
* stages.length = 전체 사용자 수
* stages[i] = 사용자가 멈춰 있는 스테이지
* 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 리턴
* ex) [2, 1, 2, 6, 2, 4, 3, 3] => [3, 4, 2, 1, 5]
* stage 3 = 도달,클리어x 2 / 도달 4 ([3,3]/[3,3,4,6]) -> 실패율이 stage 4와 같지만 스테이지 순서가 작은 순으로 정렬
* stage 4 = 도달,클리어x 1 / 도달 2 ([4]/[4, 6])
* stage 2 = 도달,클리어x 3 / 도달 7 ([2,2,2]/[2,2,2,6,4,3,3])
* stage 1 = 도달,클리어x 1 / 도달 8 ([1]/[2, 1, 2, 6, 2, 4, 3, 3])
* stage 5 = 도달,클리어x 0 / 도달 1 ([]/[6])
* stage 6 = 도달,클리어x 1 / 도달 1([6]/[6])
*
* 로직 => stages를 sort하고, 1 ~ N까지 루프를 돌면서, 각 스테이지에 머물러 있는 유저의 배열을 반환 -> 실패율 = 스테이지별 유저 배열.length / stages 배열 중 해당 스테이지의 첫번째 index부터 length-1까지 카운트 (length -index)
* 예외 : N+1
[pseudo code]
1. sort((a,b)=> a-b)를 이용해 stages 배열을 오름차순으로 정렬
2. obj = [] 빈 오브젝트를 선언하고, 각 스테이지 별 실패율을 키-밸류로 넣어 줌
3. for loo 1~N까지 돌면서 각 스테이지의 실패율을 계산
- fromIndex, start 변수를 선언
- indexOf(searchElement, fromIndex)를 이용해 stages에서 i 값의 첫번째 인덱스를 찾아 start 변수에 할당
- 다음 스테이지의 첫번째 index를 찾아 옴 (조건 : stages[stages.length-1] !== i)
- i+1이 배열에 없는 경우, indexOf는 -1을 반환 => 반환값 >0 일때까지 계속 수행
- 찾은 인덱스 값으로 fromIndex 변수에 할당
- obj[i] = {stage: i, failure : (fromIndex - start) / stages.length-1 - start}
4. obj.sort((a,b) => b[failure] - a[failure] if(동률일 경우 처리))
function solution(N, stages) {
stages = stages.sort((a, b) => a - b);
let obj = [];
for (let i = 1; i <= N; i++) {
let lastIdx = 0,
startIdx;
if (stages.includes(i)) {
startIdx = stages.indexOf(i, lastIdx);
for (let j = stages.length - 1; j >= startIdx; j--) {
//lastIdx = stages.findLastIndex((i) => i === i); findLastIndex 메서드가 안 먹음ㅠㅠ
if (stages[j] === i) {
lastIdx = j;
break;
}
}
} else startIdx = -1;
startIdx < 0
? (failure = 0)
: (failure =
(lastIdx - startIdx + 1) / (Number(stages.length) - startIdx));
obj[i - 1] = {
stage: i,
prob: failure,
};
}
console.log(obj);
return obj
.sort((a, b) => (b.prob === a.prob ? a.prob - b.prob : b.prob - a.prob))
.map((e) => e.stage);
}
console.log(solution(5, [2, 1, 2, 6, 2, 4, 3, 3]));
filter 사용해서 구현해보기!
'항해99_10기 > [2주차] 알고리즘 문제풀이' 카테고리의 다른 글
[33번] [중상] 체육복 (미완) (0) | 2022.11.25 |
---|---|
[34번][중상] 폰켓몬 (0) | 2022.11.25 |
[30번][중급] 나머지가 1이 되는 수 찾기 (0) | 2022.11.23 |
[29번][중급] K번째 수 (0) | 2022.11.23 |
[28번][중급] 최대공약수와 최소공배수 (0) | 2022.11.23 |