등수 매기기[Javascript , Java]

김도형·2022년 12월 23일
0

개요

다른 사람의 블로그에 기존 등수 매기기의 알고리즘은 [80,80,80,60,60,60] 배열로 등수 매기기를 할 때, [1,1,1,3,3,3] 으로 결과가 나오는데,

내가 원하는 것은 [1,1,1,2,2,2] 이다.

코드

일단 우선 배열에 대한 순서는 미리 설정되어 있다고 가정한다.
그러면 아까 말한 [1,1,1,3,3,3] 을 중복 제거를 통해 [1, 3] 으로 만든다.

그 이유는 중복 제거된 배열 [1,3] 의 index + 1 을 하면

  • 배열[0] -> 1등
  • 배열[1] -> 2등

의미를 가진다. 이중 for문을 사용해서, 각 배열마다 등수를 부여한다.

Javascript

const referCntArray = [3, 3, 1, 1, 1]

console.log(rankArrMaking(referCntArray))

function rankArrMaking(arr) {
    const referCntArray = arr; // [3, 3, 1, 1, 1]
    const rankArr = []; // [1, 1, 3, 3, 3]
	const rankArrFinal = [];
	


    referCntArray.forEach((number) => {
        rankArr.push(rank(number, referCntArray));
    });

    const rankArrFilter = rankArr.filter((v, i) => rankArr.indexOf(v) === i); // 중복 제거 [1, 3]

    // [1, 1, 3, 3, 3] -> [1, 1, 2, 2, 2]
	rankArr.forEach((rankArrNumber) => {
        rankArrFilter.forEach((rankArrFilterNumber, index) => {
            if(rankArrNumber == rankArrFilterNumber){
                rankArrFinal.push(index + 1)
            }
        })
    });

	return rankArrFinal
}


// 랭킹 메서드( [3, 3, 1, 1, 1] -> [1, 1, 3, 3, 3] )
function rank(value, arr) {
    var rank = arr.indexOf(value);
    if(rank > -1)
        return rank+1;
    return null;
}

Java

public static List<Integer> rankAlgorithm(List<Integer> arr){
        List<Integer> arrRank = new ArrayList<>();
        List<Integer> arrRankFinal = new ArrayList<>();

        for(Integer i = 0; i < arr.size(); i ++) {
            arrRank.add(rank(arr.get(i), arr));
        }

        List<Integer> referRankFilter = arrRank.stream().distinct().collect(Collectors.toList()); // 중복 제거

        for(Integer referRankNum : arrRank) { // 추천인 등록수 순위 생성(2), ex : [1, 1, 2, 2, 2]
            for(Integer index= 0 ; index < referRankFilter.size() ; index++){
                if(referRankNum == referRankFilter.get(index)){
                    arrRankFinal.add(index + 1);
                }
            }
        }
        return arrRankFinal;
    }

    private static Integer rank(Integer value, List<Integer> arr){
        List<Integer> sortReverseArr = arr.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        Integer rank = sortReverseArr.indexOf(value);
        if(rank > -1) { rank += 1; }
        return rank;
    }
profile
3년간 웹/앱, 자동제어 QA 🔜 개발자로 전향하여 현재 교육 회사에서 백엔드 개발자로 근무 중입니다.(LinkedIn : https://www.linkedin.com/in/dohyoung-kim-5ab09214b)

0개의 댓글