배열 자료구조 문제풀이#1

성찬홍·2024년 7월 25일

자료구조

목록 보기
3/29
post-thumbnail

배열 문제

최댓값

배열 문제

문제 1 (2562)

: 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

const test = (arr) => {
  let sort = 0;

  const maxNumber = Math.max(...arr);

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === maxNumber) {
      sort = i + 1;
    }
  }
  const result = `${sort}\n${maxNumber}`;

  return `${sort}\n${maxNumber}`;
};

console.log(test([3, 29, 38, 12, 57, 74, 40, 85, 61]));

문제2(5597)

: X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

입력
입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

const test = (arr) => {
  // 오름차순 정렬
  let ascSortArr = arr.sort((a, b) => {
    return a - b;
  });

  let result = [];

  let j = 0;
  // arr 크기까지 비교하면서 존재안할경우 result에 푸쉬
  for (let i = 1; i <= 30; i++) {
    if (j < arr.length && arr[j] === i) {
      j++;
    } else {
      result.push(i);
    }
  }
  return `${result[0]}\n${result[1]}`;
};

console.log(
  test([
    3, 1, 4, 5, 7, 9, 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
    24, 25, 26, 27, 28, 29, 30,
  ])
);

GPT 해결방안

const test = (submitted) => {
  // 1부터 30까지의 배열 생성
  const allStudents = Array.from({ length: 30 }, (_, i) => i + 1);
  
  // 제출된 학생들의 번호 제거
  submitted.forEach(num => {
    const index = allStudents.indexOf(num);
    if (index !== -1) {
      allStudents.splice(index, 1);
    }
  });
  
  // 남은 두 번호 반환 (오름차순 정렬은 기본 배열의 특성으로 이미 정렬되어 있음)
  return `${allStudents[0]}\n${allStudents[1]}`;
};
  • 내 풀이보다 좀 더 , 불필요한 연산을 줄여서 해결한 결과를 보여준다.

문제3 (1546)

:세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

출력
첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.

const test = (arr) => {
  // 내림차순 정렬
  let descArr = arr.sort((a, b) => {
    return b - a;
  });

  const maxScore = descArr[0];

  let sumScore = 0;
  descArr.forEach((item, index) => {
    sumScore += (item / maxScore) * 100;
  });

  return sumScore / arr.length;
};

console.log(test([40, 80, 60]));

GPT 해결방안

const test = (arr) => {
  // 최댓값을 찾음
  const maxScore = Math.max(...arr);

  // 각 점수를 점수/M*100으로 변환하고 합계 계산
  const sumScore = arr.reduce((sum, score) => sum + (score / maxScore) * 100, 0);

  // 새로운 평균 계산
  const newAverage = sumScore / arr.length;

  return newAverage;
};
  • 최댓값 찾기: Math.max(...arr)를 사용하여 배열에서 최댓값을 찾습니다.
  • 점수 변환 및 합계 계산: reduce를 사용하여 각 점수를 변환한 후 합계(sumScore)를 계산합니다.
  • 새로운 평균 계산: 변환된 점수의 합계(sumScore)를 배열의 길이(arr.length)로 나눠서 새로운 평균을 계산합니다.

코드 개선해야 될 점

  • 문제를 풀고 나서, 불필요한 과정을 어떻게 줄여야할지 고민해봐야 할 것 같다.
  • reduce같은 익숙하지 않은것들도 지금 연습해봐야겠다.
profile
꾸준한 개발자

0개의 댓글