-
[프로그래머스] 위클리 6주차 - 복서 정렬 하기(JS)알고리즘/프로그래머스 2021. 9. 25. 00:49728x90
문제 이해하기
복서들의 몸무게와 전적을 제안된 순서대로 정렬, 제안된 순서는
- 전체 승률이 높은복서
- (1.)값이 같은 경우 몸무게가 무거운 복서를 이긴 횟수가 많은 복서
- (1., 2.)값이 같은 경우 몸무게가 무거운 경우
- (1., 2., 3.)값 모두 같은 경우 작은 번호가 앞쪽으로
데이터 추상화
- 제안 된 순서대로 정렬을 해야함
- 제안된 `승률`, `무거운 복서 승리 횟수`, `몸무게`, `번호`를 담을 배열 사용
알고리즘
- 승률은 head2head에서 승리 횟수인 W의 개수, 패배 회수인 L을 구한 후, 승리횟수와 패배횟수를 더한 전적으로 승리값을 나누어 구한다
let winRate = head2head.map((rates)=> { let winCnt = (rates.match(/W/g) || []).length; let loseCnt = (rates.match(/L/g) || []).length; if( loseCnt + winCnt === 0 ) return 0; return winCnt / (loseCnt + winCnt); })
- 무거운 복서를 이긴 승리 횟수는 문자열을 하나씩 돌면서 승리한 `W` 이면서 몸무게가 더큰 경우에 카운트를 증가시켜 구한다.
// 자기보다 무거운 복서를 이긴 횟수 let highWeightwinCnt = head2head.map( (rates, idx) => { return [ ...rates].map( (rate,rateIdx) => { let winCnt = 0; if(rate === 'W'){ if( weights[idx] < weights[rateIdx] ){ winCnt += 1; // 가중치를 더준다 } }else { winCnt += 0; } return winCnt; }).reduce( (a,b) => (a+b)) }).map( (ele,idx) => [ winRate[idx], ele, weights[idx], idx])
- 제안된 순서대로 정렬하기
// 우선순위가 같은게 있으면 몸무게 순으로 let answer = [...highWeightwinCnt] .sort( (a,b) => { if( b[0] === a[0]){ if(b[1] === a[1]){ if(b[2] === a[2]){ return( a[3] - b[3] ) // 작은 번호 } return ( b[2] - a[2]); //몸무게가 무거운 복서 } return (b[1] - a[1]); // 몸무게가 무거운 복서를 이긴 복서 } return (b[0] - a[0]) // 전체 승률이 높은 복서 }) .map( ele => highWeightwinCnt.indexOf(ele) + 1 );
정리
- 알고리즘 분류로는 정렬
느낀점
- 문자열 안에 특정 문자의 개수를 구하는 방식에는 여러가지가 있지만 정규식을 이용하여 구현하는것이 가장 빠르고 간편하다
- 임으로 될꺼라고 가정하고 개발하기 보다는 확실한 근거로 로직을 개발하자.
728x90'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 위클리 10주차 - 교점에 별 만들기(JS) (0) 2021.10.14 [프로그래머스] 타겟 넘버 (JS) (0) 2021.10.10 [프로그래머스] 위클리 9주차 - 전력망을 둘로 나누기(JS) (0) 2021.10.09 [프로그래머스] 위클리 2주차 - 상호평가(JS) (0) 2021.10.04 [프로그래머스] 위클리 1주차 - 부족한 금액 계산하기(JS) (0) 2021.09.30