제코배 JS 100) entries, sort, pop, push 활용하기
https://www.notion.so/JS-100-1-0465a498481c471488646526a181087f
JS 100제 - 1권
A new tool for teams & individuals that blends everyday work apps into one.
www.notion.so
문제출처 : 제주코딩베이스 JS 100제
우선 49번 문제까지 해결. 49번까지는 JS의 기본 메소드를 학습할 수 있는 문제들로 구성돼 있다.
학습 목표
JS가 가진 여러 메소드를 활용해 객체와 배열을 자유자재로 다룰 수 있도록 트레이닝하는 것을 목표로 했다.
풀이 방식
1) 풀이가 머릿속으로 바로 떠오르지 않을 때는 먼저 어떤 프로세스로 코딩할지 주석으로 먼저 썼다.
2) 각 프로세스에 맞는 함수가 무엇이 있는지 생각해보고, 검색한다.
3) 풀이 대로 결과가 나오는지 테스트한다.
4) 코드에다가 상세설명 주석을 단다.
다음은 문제풀이. 학습이 됐던 문제만 선별했다.
문제 38. 호준이의 아르바이트
호준이는 아르바이트로 영어 학원에서 단어 시험지를 채점하는 일을 하고 있다. 호준이가 일하는 학원은 매번 1위부터 3위까지의 학생에게 상으로 사탕을 준다. 그런데 오늘은 마침 사탕이 다 떨어져서 호준이가 채점을 하고 점수를 보내면, 당신이 아이들의 숫자만큼 사탕을 사러 가기로 했다.
1위 ~ 3위 학생은 여러명일 수 있고 1~3위 학생 중 중복되는 학생까지 포함하여 사탕을 사기로 한다.
학생들의 점수를 공백으로 구분하여 입력을 받고 사탕을 받을 학생의 수를 출력하세요.
프로세스
1) split으로 socreArray 만들기
2) sort로 내림차순 정렬
3) 중복 없앤 배열 만들기
4) idx 2까지 뽑아내기
5) scoreArray에서 idx 2까지 포함하고 있는 개수 filter로 세기
let score = '97 86 75 66 55 97 85 97 97 95';
const candyCount = function(score){
const scoreArray = score.split(' ');
//내림차순 정렬
scoreArray.sort(function(a, b){
return b-a;
});
console.log("전체 점수 : "+scoreArray)
//중복 제거
let scoreArrayNotDup = new Set(scoreArray);
scoreArrayNotDup = [...scoreArrayNotDup];
console.log("중복 제거 후 : "+scoreArrayNotDup);
console.log(`1위 점수 ${scoreArrayNotDup[0]} 2위 점수 ${scoreArrayNotDup[1]} 3위 점수 ${scoreArrayNotDup[2]}`);
//1, 2, 3위 점수에 해당하는 사람 수 구하기
let totalCandyCount = 0;
for(let i = 0; i < 3; i++){
totalCandyCount += scoreArray.filter(el=>el===scoreArrayNotDup[i]).length;
}
return totalCandyCount;
}
중복을 제거할 때 Set을 사용했다. set은 객체{ }를 반환하므로 ...로 배열을 만들어준다
또 다른 풀이가 인상적이어서 기록해둔다.
프로세스
1. 배열을 오름차순으로 정렬
2. 새 배열 선언
3. pop()을 이용해 뒤에서부터 기존 배열 값을 빼오기(오름차순이므로 큰값부터 가져옴)
4. 새 배열에 pop()으로 제거한 원소를 넣기. 만약에 새 배열에 원소값이 있으면 그냥 넘어가기.
5. 반복문이 한 번씩 돌 때마다 count +1 하기.
6. 새 배열의 길이가 3일 때 반복을 중지하기.
pop()은 제거한 맨끝 원소를 반환하고, push는 원소를 추가한 뒤 새 배열의 길이를 반환한다.
const candyCount2 = function(score){
const scores = score.split(' ').map(function(n){
return parseInt(n, 10);
});
scores.sort((a, b) => {
return a-b;
}); //n을 오름차순으로 정렬
let count = 0;
let arr = [];
while (arr.length < 3) { //배열 길이가 3일 때 멈추기
console.log("scores 기존 배열 : "+scores);
let n = scores.pop(); //pop()은 제거한 요소를 반환
console.log("제거한 원소 : "+n);
if (!arr.includes(n)){ // 새 배열 arr에 n이 포함돼있지 않을 경우
let b = arr.push(n); // n을 추가한다.
console.log("추가한 원소 : "+n+" 배열의 길이 : "+ b);
}
console.log("arr 배열 : "+arr);
count += 1;
}
//console.log(count);
}
43. 10진수를 2진수로
const parseInt10to2 = function(num){
return num.toString(2);
};
44. 사용자가 입력한 양의 정수의 각 자리수의 합을 구하는 프로그램을 만들어주세요.
const sumNum = function(num){
let numArray = num.toString().split(''); //num을 string으로 변환한 뒤, 각 자릿수를 원소로 한 배열제작
//console.log(numArray);
let sum = 0;
numArray.forEach(e =>
sum += parseInt(e,10) //sum에다가 모든 원소를 더함
)
return sum;
}
나는 숫자도 모두 배열로 만들어서 푸는 방식을 선호하는데, 숫자 연산을 만들어서 푸는 연습이 필요한 거 같다. 숫자연산이 훨씬 효율적이니까! 이런 것처럼.
let sum = 0;
while(n !== 0){
sum += (n % 10);
n = Math.floor(n/10);
}
console.log(sum);
47. 중복 제거하기 => entries
문제는 set을 이용하라 했는데, 이것 저것 찾아보다 보니 유요한 메소드가 있어서 정리.
Obejct.entries(객체); 메소드는 객체의 key와 value 한 쌍을 배열 원소로 갖는 2차 배열을 리턴한다.
const obj ={snack:1000, icecream: 2000};
Object.entries(obj);
// return : [[snack, 1000],[icecream, 2000]]
etries로 만든 배열 원소를 각각 꺼내오고 싶을 때는 아래와 같은 방식으로도 가능하다.
for (const [key, value] of Object.entries(people)) {
console.log(`${key}: ${value}`);
}
그래서 아래 풀이.
const people = {
이호준: "01050442903",
이호상: "01051442904",
이준호: "01050342904",
이호준: "01050442903",
이준: "01050412904",
이호: "01050443904",
이호준: "01050442903"
};
let obj = {};
//객체를 배열로 만들기
const removeDup = function(people){
let peopleArray = Object.entries(people); //return [ [key, value] ]
for (const [key, value] of Object.entries(people)) {
console.log(`${key}: ${value}`);
}
//console.log(peopleArray);
}