코딩/프로그래머스 코딩테스트

[프로그래머스] 실패율

민쯔 2021. 10. 25. 02:37
728x90
반응형

안녕하세요. 민쯔입니다.😊

이번 주에는 실패율 문제를 풀어보았는데요.

이번에도 역시나... 잘 안 풀려서ㅠ 남친님한테 SOS해서 풀었습니다.😂

남친님이 치는 코드 보면 존경스러워요ㅠㅠ 너무 잘해요. 그냥 봐도 이해가 되고 자바스크립트 치는 사람도 아닌데 왜 이렇게 잘 푸는지...🤣 저도 풀다보면 잘 풀겠죠.

 

그럼 실패율 해결방안에 대해 설명하겠습니다.

function solution(N, stages) {
    let fRArr = [];
    let sSn = stages.length;
    
    // 실패율 구해서 배열에 추가
    for(let i=0; i<N; i++){
        let nC = stages.filter(stage => stage == (i+1)).length;
        fRArr.push(nC / sSn);
        sSn -= nC;
    }
    
    // 배열을 Map으로 변경
    const fRMap = fRArr.map((element, index)=>{
        return{index: index, value: element};
    });
    
    // 정렬
    fRMap.sort((a, b)=>{
        // vlaue는 내림차순
        if (a.value > b.value) return -1;
        if (a.value < b.value) return 1;
        return 0;
    });
    
    // 정렬 완료한 Map을 배열로 변경
    let answer = fRMap.map(n =>{
        return n.index + 1;
    });
    return answer;
}

 

  • N : 전체 스테이지의 개수
  • stages : 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열
  • 실패율 : 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
  • 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

 

실패율 구해서 배열에 추가

먼저 이문제를 풀기 위해서 실패율 구하는 거에 대해 이해가 필요합니다.

입출력 예 #1로 설명을 하자면

  • N : 5 -> 1, 2, 3, 4, 5 스테이지가 있습니다.
  • stages = [2, 1, 2, 6, 2, 4, 3, 3]
    • 1 : 1개
    • 2 : 3개
    • 3 : 2개
    • 4 : 1개
    • 5 : 0개
    • 6 : 1개

 

실패율은 솔직히 글로 읽을 때 이해가 안되서 입출력 설명 보면서 이해했습니다.

  • 1 번 스테이지 실패율 : 1/8
  • 2 번 스테이지 실패율 : 3/7
  • 3 번 스테이지 실패율 : 2/4
  • 4번 스테이지 실패율 : 1/2
  • 5번 스테이지 실패율 : 0/1

앞 / 뒤 라고 하면

앞은 stage배열 안에 있는 n번의 개수입니다.

제가 위에서 stage에 각각 원소를 썼는데 1이면 1개, 2이면 3개... 이렇게 써주시면 됩니다.

  • 1번 : 1/
  • 2번 : 3/ ...

뒤는 stage에 전체 원소 - 이전 번의 stage 원소 개수입니다.

근데 이게 누적이 돼요.

  • 1번 : 1보다 작은 스테이지는 없음으로 현재 stage.length인 8입니다.
  • 2번 : 이전 뒤의 수 8 임으로 8 - 1번의 stage 원소 개수(1개) = 8 - 1 = 7
  • 3번 : 이전 뒤의 수 7 임으로 7 - 2번의 stage 원소 개수(3개) = 7 - 3 = 4
  • 4번 : 이전 뒤의 수 4 임으로 4 - 3번의 stage 원소 개수(2개) = 4 - 2 = 2
  • 5번 : 이전 뒤의 수 2 임으로 2 - 4번의 stage 원소 개수(1개) = 2 - 1 = 1

이런 식으로 누적이 됩니다.

 

이걸 코드로 작성하면

// 실패율 구해서 배열에 추가
for(let i=0; i<N; i++){
        let nC = stages.filter(stage => stage == (i+1)).length;
        fRArr.push(nC / sSn);
        sSn -= nC;
}
  • fRArr : 실패율 담을 배열
  • sSn = stages.length; // #1에서는 8
  • for(let i=0; i<N; i++) // #1에서는 5임으로 0, 1, 2, 3, 4
  • nC : 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수
  • stages.filter(stage => stage == (i+1)).length;
    • stages배열 원소가 현재 스테이지와 같은 숫자인 수이면 추출
    • filter : 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환
    • stage == (i+1)
      • i+1 : for문에서 초기값으로 0인데 스테이지는 1부터 시작임으로 i+1으로 해야 됩니다.
    • .length;
      • filter은 배열로 반환하기 때문에 .length를 써야 개수를 파악할 수 있습니다.
  • console.log(nC); // #1에서는 1, 3, 2, 1, 0

 

  • fRArr.push(nC / sSn);
    • push :  배열의 끝에 하나 이상의 요소를 추가
    • sSn : 처음에는 stages.length;을 써야 됨으로
  • sSn -= nC; // stages배열에 이전 스테이지의 개수를 빼기(계속 누적됨)
  • console.log(fRArr); // #1에서는 [ 0.125, 0.42857142857142855, 0.5, 0.5, 0 ]

 

실패율을 구해서 배열에 담는 것 까지는 쉬웠어요. 설명이 주절주절 길었지만 여기까지는 저도 쉽게 풀었어요.

이제 이다음부터가 문제예요.

 

배열을 Map으로 변경

문제에서 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 구하라고 했습니다.

실패율 기준으로 스테이지 번호를 정렬해야 되는데 이걸 해결을 하려면 실패율을 담은 배열을 Map로 바꿔야 됩니다.

왜냐하면 배열은 하나밖에 제어를 못하지만 맵은 key, value를 사용해서 두 가지를 제어할 수 있거든요.

// 배열을 Map으로 변경
    const fRMap = fRArr.map((element, index)=>{
        return{index: index, value: element};
    });

map(currentValue, index, array) 을 넣을 수 있는데

  • currentValue :처리할 현재 요소.
  • index : 처리할 현재 요소의 인덱스.
  • array : 호출한 배열.

여기서는 currentValue, index 인자만 쓰겠습니다.

console.log(fRMap);

[
  { index: 0, value: 0.125 },
  { index: 1, value: 0.42857142857142855 },
  { index: 2, value: 0.5 },
  { index: 3, value: 0.5 },
  { index: 4, value: 0 }
]

요기 블로그 참고해서 했습니다. 👇

https://7942yongdae.tistory.com/48

 

Javascript - Array map 사용법

오늘은 Javascript의 Array가 가지고 있는 map의 정의와 사용법 그리고 활용 방법에 대해 이야기해보려고 합니다. 일단 Array가 가진 map 함수가 어떤 함수인 지부터 살펴보도록 하죠. map 정의 Array.prototy

7942yongdae.tistory.com

map은 새로운 배열을 반환할 때만 사용하는 줄 알았는데, map을 만들 때 쓰이는지 이번 기회에 알게 되었습니다.

 

실패율 정렬

// 정렬
    fRMap.sort((a, b)=>{
        // vlaue는 내림차순
        if (a.value > b.value) return -1;
        if (a.value < b.value) return 1;
        return 0;
    });

정렬은 역시나 sort를 사용했습니다. 이것도 처음 안건대 객체도 정렬할 수 있더라고요

현재 앞에서 map로 바꾼 index, value로 정렬을 하면 실패율은 value에 담겨있는데

문제에서 실패율 기준으로 내림차순으로 하라 했으니 value는 내림차순으로 정렬해야 됩니다.

내림차순

if (a.value > b.value) return -1;
if (a.value < b.value) return 1;
return 0;

만약 오름차순이면

if (a.value > b.value) return 1;
if (a.value < b.value) return -1;
return 0;

console.log(fRMap); 
[
  { index: 2, value: 0.5 },
  { index: 3, value: 0.5 },
  { index: 1, value: 0.42857142857142855 },
  { index: 0, value: 0.125 },
  { index: 4, value: 0 }
]

이건 모질라 참고해서 했습니다. 객체 정렬에 대해 나와있어요.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

 

Array.prototype.sort() - JavaScript | MDN

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.

developer.mozilla.org

 

정렬 완료한 Map을 배열로 변경

이제 마지막으로 정렬 완료한 것을 배열로 변경하면 됩니다.

// 정렬 완료한 Map을 배열로 변경
    let answer = fRMap.map(n =>{
        return n.index + 1;
    });
    return answer;

다시 map을 사용해서 fRMap의 맵에 index만 추출해서 다시 배열로 만들어 줍니다.

  • n.index + 1; : fRMap에서 index는 0부터 시작임으로 +1을 해서 1부터 시작으로 바꿔줍니다.

 

728x90
반응형