Ethan(기린)
그린기린그림 일기
Ethan(기린)
전체 방문자
오늘
어제
  • 전체보기 (43)
    • Language (4)
      • JavaScript (4)
    • Web (0)
      • HTML (0)
    • Problem Solving (29)
      • BOJ (18)
      • 프로그래머스 (10)
    • Computer Science (3)
      • Algorithm & Data Structure (2)
      • Network (1)
    • Error Log (4)
    • Config (1)
      • Test (1)
    • Thinking (2)
      • Retrospect (2)
      • Essay (0)
    • Book (0)

인기 글

최근 글

최근 댓글

태그

  • 문자열
  • Java의 정석 3rd Edition
  • 백준
  • boj
  • Problem Solving
  • Object-oriented programming
  • 객체 지향 프로그래밍
  • Lv. 2
  • 완전탐색
  • 프로그래머스
  • Java
  • JavaScript
  • Lv. 1
  • 알고리즘
  • OOP

티스토리

hELLO · Designed By 정상우.
Ethan(기린)

그린기린그림 일기

[ Lv. 1 ] 모의고사 - JavaScript
Problem Solving/프로그래머스

[ Lv. 1 ] 모의고사 - JavaScript

2022. 6. 25. 10:18

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.

제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

answers return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

입출력 예 설명

입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.

내풀이

function solution(answers) {
    
    const result = [];
    
    const count = [0 ,0, 0];
    
    const student1 = [1, 2, 3, 4, 5];
    const student2 = [2, 1, 2, 3, 2, 4, 2, 5];
    const student3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    
    for(let i = 0; i < answers.length; i++){
        if(answers[i] === student1[i % student1.length]) count[0]++;
        if(answers[i] === student2[i % student2.length]) count[1]++;
        if(answers[i] === student3[i % student3.length]) count[2]++;
    }
    
    const highestScore = Math.max(...count);
    
    for(let i = 0; i < count.length; i++){
        if(count[i] === highestScore) result.push(i+1);
    }
    
    return result;
}

 

문제 해결 과정

완전탐색은 의미 그대로 모든 경우의 수를 확인해서 정답을 찾는 방법을 말한다. 다양한 기법들이 있으나, 현재로써는 입력의 크기가 10,000으로 O(n²)으로도 문제 없을 것으로 판단해서 단순 브루트 포스를 이용한 방법으로 접근하기로 했다.

문제의 핵심은 최득점을 한 학생의 번호를 출력하는 것이고, 여러명인 경우 오름차순으로 정렬하여 출력하는 것으로 이해했다. 각자 학생들마다 정답을 찍는 패턴이 존재하기 때문에 이 값을 배열 자료형에 담고 정답이 담긴 배열에서 학생이 찍은 번호가 일치하는지 검사하도록 해서 일치하는 경우 count 라는 변수에 해당하는 인덱스 안의 값을 1씩 증가시켜서 학생 별로 정답을 맞은 수를 모두 처리했다.

그 다음 그 배열의 최댓 값을 Math.max 함수로 구해서 heighestScore 변수에 담고 학생 수의 길이만큼 순회하면서 count 안의 인덱스 값과 최댓 값이 일치하는 경우(최득점을 한 경우) 순서대로 result 배열 안에 학생의 번호를 push 하도록 해서 구현했다. (오름차순 정렬을 하지 않더라도 순서대로 학생이 정렬되어 push되기 때문에 추가 작업은 처리하지 않음) 

참고 

[완전 탐색] https://hongjw1938.tistory.com/78?category=909529

 

알고리즘 - 완전탐색(Exhaustive Search)

1. 완전탐색 알고리즘이란? 완전탐색은 간단히 가능한 모든 경우의 수를 다 체크해서 정답을 찾는 방법이다. 즉, 무식하게 가능한 거 다 해보겠다는 방법을 의미한다. 이 방법은 무식하게 한다는

hongjw1938.tistory.com

 

저작자표시 비영리 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

[ Lv. 2 ] 카펫 - JavaScript  (0) 2022.06.25
[ Lv. 2 ] 소수 찾기 - JavaScript  (0) 2022.06.25
[ Lv. 1 ] 최대공약수와 최소공배수 - JavaScript  (0) 2022.06.11
[ Lv. 1 ] 핸드폰 번호 가리기  (0) 2022.06.11
[ Lv. 1 ] 하샤드 수 - JavaScript  (0) 2022.06.10
    'Problem Solving/프로그래머스' 카테고리의 다른 글
    • [ Lv. 2 ] 카펫 - JavaScript
    • [ Lv. 2 ] 소수 찾기 - JavaScript
    • [ Lv. 1 ] 최대공약수와 최소공배수 - JavaScript
    • [ Lv. 1 ] 핸드폰 번호 가리기
    Ethan(기린)
    Ethan(기린)

    티스토리툴바