본문 바로가기
알고리즘/프로그래머스

[Level 1][완전탐색] 모의고사(Java, JavaScript, Python3)

by devpine 2020. 3. 25.
반응형

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

입출력 예

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

입출력 예 설명

입출력 예 #1

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

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

입출력 예 #2

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

 


풀이 1(Java)

import java.util.*;
class Solution {
    public int[] solution(int[] answers) {
    	// 1. 학생별 문제 찍는 패턴 배열
        int[] a ={1, 2, 3, 4, 5};
        int[] b ={2, 1, 2, 3, 2, 4, 2, 5};
        int[] c ={3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        // 2. 맞힌 문제 수 score 배열에 담기 
        int[] score = new int[3];
        for(int i = 0;i<answers.length;i++){
            if(answers[i]==a[i%5]) score[0]++;
            if(answers[i]==b[i%8]) score[1]++;
            if(answers[i]==c[i%10]) score[2]++;
        }
        // 3. 가장 많은 문제를 맞힌 사람
        int max = Math.max(score[0], Math.max(score[1], score[2]));
        ArrayList<Integer> list =new ArrayList<>();
        if(max == score[0]) {list.add(1);}
        if(max == score[1]) {list.add(2);}
        if(max == score[2]) {list.add(3);}
        return list.stream().mapToInt(i->i.intValue()).toArray();
    }
}

 

풀이 2(JavaScript)

function solution(answers) {
  let result = [];
  // 1. 세 학생이 찍는 패턴
  let student_1 = [1, 2, 3, 4, 5];
  let student_2 = [2, 1, 2, 3, 2, 4, 2, 5];
  let student_3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

  // 2. 세 학생이 맞힌 문제 수
  let count_student_1 = answers.filter(
    (answer, i) => answer === student_1[i % student_1.length]
  ).length;
  let count_student_2 = answers.filter(
    (answer, i) => answer === student_2[i % student_2.length]
  ).length;
  let count_student_3 = answers.filter(
    (answer, i) => answer === student_3[i % student_3.length]
  ).length;

  // 3. 문제를 가장 많이 맞힌 학생 배열을 반환하기
  let max = Math.max(count_student_1, count_student_2, count_student_3);
  if (max === count_student_1) {
    result.push(1);
  }
  if (max == count_student_2) {
    result.push(2);
  }
  if (max == count_student_3) {
    result.push(3);
  }
  return result;
}

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

 

풀이 3(Python3)

def solution(answers):
    answer = []
    # 1. 세 학생이 찍는 패턴 배열
    first = [1, 2, 3, 4, 5]
    second = [2, 1, 2, 3, 2, 4, 2, 5]
    third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

    first_count = 0
    second_count = 0
    third_count = 0

	# 2. 세 학생이 맞힌 문제 수
    for i in range(0, len(answers)):
        if answers[i] == first[i%5]:
            first_count = first_count + 1
        if answers[i] == second[i%8]:
            second_count = second_count + 1
        if answers[i] == third[i%10]:
            third_count = third_count + 1
	
    # 3. 문제를 가장 많이 맞힌 학생 배열을 반환하기
    max_count = max(first_count, second_count, third_count)
    if max_count == first_count:
        answer.append(1)
    if max_count == second_count:
        answer.append(2)
    if max_count == third_count:
        answer.append(3)

    print(answer)

    return answer

 

반응형

댓글