reduce(), 정렬 sort(), Math.floor() (코문풀 bj-18110번, lc-153번,912번)

do yun·2021년 4월 1일
0

💻코딩문제풀이

▶학습한 내용 (Javascript)

reduce()
:빈 요소를 제외하고 배열 내에 존재하는 각 요소에 대해 callback함수를 한번씩 실행하며, 콜백 함수는 다음 4개 인수를 받음
:배열의 내장함수로써 합계를 계산할 수 있음
:매개변수
1.accumulator 누산기는 콜백의 반환값을 누적함.
2.currentValue 처리할 현재 요소
3.currentIndex (선택옵션) 처리할
4.array
:누적 계산의 결과 값을 반환함
-sort()
배열.sort()는 일반적으로 문자 정렬할 때 사용
배열.sort(function(a.b){ // 오름차순
return a-b;
});는 a,b 두숫자의 차가 양수 값이냐, 음수값이냐를 이용하여 숫자를 오름차순으로 정렬하는 방법임
-Math.floor() : 주어진 숫자와 같거나 작은 정수중에서 가장 큰 수를 반환하는 함수

🔎백준문제

#18110번 solved.ac <난이도:3> 링크

해설: 극단적인 값들이 평균을 왜곡하는 것을 막기 위해 가장 큰 값들과 가장 작은 값들을 제외하고 평균을 내는 것을 말한다. 30% 절사평균의 경우 위에서 15%, 아래에서 15%를 각각 제외하고 평균 난이도를 계산한다. 20명이 투표했다면, 가장 높은 난이도에 투표한 3명과 가장 낮은 난이도에 투표한 3명의 투표는 평균 계산에 반영하지 않는다는 것이다.
ex1.
Input:
5
1
5
5
7
8
Output:
6
-> 5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

let num = parseInt(prompt());
let cnt = 0;

let arr = [];
cnt = Math.round(num *0.15);
for(let i=0;i<num;i++){
  arr[i] =parseInt(prompt()); 
}

arr.sort(function(a,b){
  return a-b;
});

for(let i=0;i<cnt;i++){
  delete arr[i];
}

for(let i=arr.length-1;i>arr.length-cnt-1;i--){
  delete arr[i];
}

let result = arr.reduce(function add(sum, currValue){
	return sum + currValue;
},0);

let avg = result / (arr.length-(cnt*2)) ;

alert(Math.round(avg));

문제풀이:
1.절사평균을 내기 위해 cnt 변수에 전체의 15%인 인원 수를 대입한다.
2.n번 입력 받은 난이도를 오름차순 정렬한다.
3.최하점을 준 15%와 최상점을 준 15%의 값은 삭제한다.
4.나머지의 난이도를 평균내 최종 평균 난이도로 채택한다.

🔎leetcode

#153. Find Minimum in Rotated Sorted Array <난이도:3>
링크

해설: n오름차순으로 정렬 된 길이 배열이 1과 n 사이 횟수만큼 회전 한다고 가정한다. 고유 요소 의 정렬 된 회전 배열 nums이 주어지면 이 배열의 최소 요소를 반환한다.
ex1.
Input: nums = [3,4,5,1,2]
Output: 1
Explanation: The original array was [1,2,3,4,5] rotated 3 times.
ex2.
Input: nums = [4,5,6,7,0,1,2]
Output: 0
Explanation: The original array was [0,1,2,4,5,6,7] and it was rotated 4 times.
ex.3
Input: nums = [11,13,15,17]
Output: 11
Explanation: The original array was [11,13,15,17] and it was rotated 4 times.

function findMin(nums) {
  let l = 0;
  let r = nums.length - 1;
  while (l < r) {
    const m = Math.floor((l + r) / 2);
    if (nums[m] > nums[r]) l = m + 1;
    else r = m;
  }
  return nums[l];
}
  

회전을 몇번 했는가를 구하기는 어렵지만, 이 배열의 최소 elements를 구하는 것은 가능했다.
문제를 완전히 이해하지는 못 하였다.
왼쪽과 오른쪽 값을 대소 비교해 소팅해주는 방법으로 구현한다.

#912. Sort an Array <난이도:1> 링크

해설: nums의 원소들을 오름차순으로 소팅하는 문제이다.
ex1.
Input: nums = [5,2,3,1]
Output: [1,2,3,5]
ex2.
Input: nums = [5,1,1,2,0,0]
Output: [0,0,1,1,2,5]

문제풀이

var sortArray = function(nums) {
  nums.sort(function(a,b){
  return a-b;                
  });
   return nums;
};

sort함수를 이용하면 오름차순으로 쉽게 구현할 수 있었다. 단 자바스크립트에서는 .sort(function(a,b){return a-b;});으로 작성해줘야지만 양의 정수가 오름차순으로 정렬된다.

다시 풀어볼 문제
앞으로 풀어볼 문제

profile
탭댄스를 추듯 경쾌하게

0개의 댓글

관련 채용 정보