230406_Algorithm

majungha·2023년 4월 27일
1

알고리즘

목록 보기
18/71

오늘의 알고리즘 👍

📝 1. 모의고사


  • 수포자는 수학을 포기한 사람의 준말입니다.
  • 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다.
  • 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
  • 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
  • 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
  • 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
  • 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때,
  • 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

▷ 입출력 예

solution([1,2,3,4,5]) // [1]
solution([1,3,2,4,2]) // [1,2,3]

▷ 내 풀이

▷ 해결못함 ❌

function solution(answers) {
  const answer = [];
  let count1 = 0;
  let count2 = 0;
  let count3 = 0;
  const arr1 = [1, 2, 3, 4, 5];
  const arr2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const arr3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  for (let i = 0; i < answers.length; i++) {
    answers[i] === arr1[i % 5] ? count1++ : 0;
    answers[i] === arr2[i % 8] ? count2++ : 0;
    answers[i] === arr3[i % 10] ? count3++ : 0;
  }
  console.log(count1);
  console.log(count2);
  console.log(count3);
  if (count1 === count2 && count3) {
    answer.push(1, 2, 3);
  } else if ((count1 !== count2) !== count3) {
    answer.push(count1 > count2 ? 1 : 2) > count3 ? (count1 > count2 ? 1 : 2) : count3;
  } else if (count1 === count2) {
    answer.push(1, 2);
  } else if (count2 === count3) {
    answer.push(2, 3);
  } else if (count1 === count3) {
    answer.push(1, 3);
  }
  return answer;
}

▷ 수업 풀이

const answerTable = [
  // 1번 수포자가 찍는 패턴
  [1, 2, 3, 4, 5], // 5개의 숫자
  // 2번 수포자가 찍는 패턴
  [2, 1, 2, 3, 2, 4, 2, 5], // 8개의 숫자
  // 3번 수포자가 찍는 패턴
  [3, 3, 1, 1, 2, 2, 4, 4, 5, 5], // 10개의 숫자
];
function solution(answers) {
  // 학생들의 점수를 저장하는 배열
  const score = [0, 0, 0];
  for (let i = 0; i < answers.length; i++) {
    for (let j = 0; j < answerTable.length; j++) {
      const answer = answerTable[j][i % answerTable[j].length];
      if (answers[i] === answer) {
        score[j]++;
      }
    }
  }
  // 제일 많이 맞춘 문제의 수를 뽑아온다
  const biggest = Math.max(...score);
  const arr = [];
  for (let i = 0; i < score.length; i++) {
    if (biggest === score[i]) {
      arr.push(i + 1);
    }
  }
  return arr;
}

▷ map, filter, reduce 메서드 사용 풀이

const answerTable = [
  // 1번 수포자가 찍는 패턴
  [1, 2, 3, 4, 5], // 5개의 숫자
  // 2번 수포자가 찍는 패턴
  [2, 1, 2, 3, 2, 4, 2, 5], // 8개의 숫자
  // 3번 수포자가 찍는 패턴
  [3, 3, 1, 1, 2, 2, 4, 4, 5, 5], // 10개의 숫자
];
function solution(answers) {
  // 학생들의 점수를 저장하는 배열
  const scoreList = answerTable.map((el, i) => {
    const score = answers.reduce((acc, cur, j) => {
      return acc + (el[j % el.length] === cur ? 1 : 0);
    }, 0);
    return { student: i + 1, score }; // 숏핸드 프로퍼티
  });
  // 제일 많이 맞춘 문제의 수를 뽑아온다.
  const biggest = Math.max(
    ...scoreList.map((el) => {
      return el.score;
    }),
  );
  // 가장 많이 맞춘 학생만 남긴다.
  return scoreList
    .filter((el) => {
      return biggest === el.score;
      // 학생의 번호만 뽑아서 배열에 담아준다.
    })
    .map((el) => {
      return el.student;
    });
}

출처: 프로그래머스
출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글