자바스크립트 100제:38번

CHOI·2024년 3월 14일

javaScript

목록 보기
1/8

※자바스크립트 100제는 여기서 다운받았습니다.

문제

  • 호준이는 아르바이트로 영어 학원에서 단어 시험지를 체점하는 일을 하고 있다. 호준이가 일하는 학원은 매번 1위부터 3위까지의 학생에게 상으로 사탕을 준다. 그런데 오늘은 마침 사탕이 다 떨어져서 호준이가 채점을 하고 점수를 보내면, 당신이 아이들의 숫자만큼 사탕을 사러 가기로 했다.
  • 1위~ 3위 학생은 여러명일 수 있고, 1~3위 학생 중 중복되는 학생까지 포함하여 사탕을 사기로 한다. 학생들의 점수를 공백으로 구분하여 입력을 받고 사탕을 받을 학생의 수를 출력하세요.

입출력 결과

입력: 97 86 75 66 55 97 85 97 97 95
출력: 6

풀이 과정

 function students() {
    // 받은 값을 배열로 정의
    var scores = [...arguments];

    // 각 값이 몇 개 있는지 확인
    var num = {};
    scores.forEach((x) => {
      if (num[x]) {
        num[x] = num[x] + 1;
      } else {
        num[x] = 1;
      }
    });

    // 점수:개수 객체
    // console.log(num);

    // 점수:개수 객체의 key값(점수)의 배열
    var numKey = Object.keys(num);

    // 점수 배열의 정렬
    var sortNum = numKey.sort((a, b) => {
      return b - a;
    });

    // 점수가 가장 높은 세 개 값 구함(score1, score2, score3)
    var score1 = sortNum[0];
    var score2 = sortNum[1];
    var score3 = sortNum[2];

    // 점수:개수 객체에서 점수가 가장 높은 세 개 값이 몇 번째 인덱스에 있는지 구해야 함
    // 점수:개수 객체에서 점수만 배열로 빼옴
    var scores_num = Object.keys(num);

    // 점수 배열에서 score1, score2, score3의 인덱스 구함
    var index1 = scores_num.indexOf(score1);
    var index2 = scores_num.indexOf(score2);
    var index3 = scores_num.indexOf(score3);

    // 점수:개수 객체에서 구한 인덱스에 위치한 value값들을 더함
    console.log(
      Object.values(num)[index1] + Object.values(num)[index2] + Object.values(num)[index3]
    );
  }
  // **출력**
  students(97, 86, 75, 66, 55, 97, 85, 97, 97, 95);
  >6

사용된 요소 중 앞으로 더 알아봐야 할 것들

arguments

arguments 활용 예시

  function students() {
    var scores = [...arguments];  //scores에 매개변수 배열 할당
    console.log(scores)
  }
  students(1,2,3);

출력: [1, 2, 3]

  • 함수 내에서 console.log(arguments); 실행 시 마치 배열의 형태로 매개변수를 출력해주기는 하나 배열은 아니다.
  • [... arguments]의 형태로 배열로 변환 가능하다.

Object 객체

Object 객체 활용 예시

  var nums = { 이름1: 90, 이름2: 100, 이름3: 95}
  console.log(Object.keys(nums));
  console.log(Object.values(nums));
  console.log(Object.keys(nums)[1]);
  console.log(Object.values(nums)[1]);

출력
['이름1', '이름2', '이름3'] 
[90, 100, 95] 
이름2
100

  • Object.keys(객체 이름) -> 객체 key값의 배열 생성
  • Object.values(객체 이름) -> 객체 value값의 배열 생성
  • Object.keys(객체 이름)[n] -> 객체 내 인덱스 n번에 위치한 key값 출력
  • Object.values(객체 이름)[n] -> 객체 내 인덱스 n번에 위치한 value값 출력

indexOf

indexOf 활용 예시

  var nums = [10, 20, 30, 40, 50];
  var i = nums.indexOf(10);
  console.log(nums[i]);

출력: 10

  • 객체가 아니라 배열에서만 사용 가능하다! 헷갈리지 말자
  • 앞서 Object 객체를 이용해 객체의 key값 혹은 value값의 배열을 구한 후, indexOf를 통해 인덱스 번호를 추출하여 특정 key값을 가진 index에 위치한 value값을 구하거나, 혹은 그 반대의 경우를 구할 수 있다.

배열 내 중복되는 값 개수

  var nums = [10, 10, 10, 20, 20, 20, 30, 40, 50];
  var result = {};
  nums.forEach((x) => {
    if (result[x]) {
      result[x] = result[x] + 1;
    } else {
      result[x] = 1;
    }
  });
  console.log(result);

출력 : {10: 3, 20: 3, 30: 1, 40: 1, 50: 1}

  1. var result={}를 통해 최종 출력할 빈 객체를 만들어준다.
  2. nums.forEach(콜백함수)를 통해 콜백함수를 각 배열마다 적용하게 한다.
  3. if(result[x])를 통해 result[x]가 존재하면 if문으로, 존재하지 않으면 else문으로 가게 한다.
  4. 맨 처음 들어간 10이라는 매개변수는 당연히 result에 존재하지 않으므로 else문을 향하여 result[10]=1이 된다. 그리하여 result{10:1} 객체가 되는 것이다.
  5. 그 다음 들어간 10이라는 매개변수는 result에 존재하므로 result[10]if문을 통해 +1되어 result[10]은 2가 된다. result={10:2}
  6. 이 과정이 배열 요소를 돌며 반복되어 결과가 출력된다.

배열 내 숫자 정렬

  var num = [1, 2, 50, 6, 24, 31];
  var sortNum = num.sort((a, b) => {
    return a - b;
  });
  console.log(sortNum);

출력: [1, 2, 6, 24, 31, 50]

  • 콜백함수 없이 num.sort()할 시 첫 번째 글자부터 비교하여 [1, 2, 24, 31, 50]으로 정렬된다.
  • sort는 배열 요소 두 가지를 a와 b 자리에 넣어 a-b를 한 후 음수가 나오면 a를 왼쪽으로, b를 오른쪽으로 넘기고 양수가 나오면 a를 오른쪽으로 b를 왼쪽으로 넘긴다. 이 작업을 반복한다.
  • 첫 번째 글자부터 비교하는 이유는 매개변수가 number형태여도 문자열로 변환하여 비교하기 때문이다.
  • 그래서 콜백함수를 통해 number 계산식을 통해 비교한 후 정렬하게 한다.
profile
개발자를 목표로!

0개의 댓글