will come true

[프로그래머스 / Level1] 모의고사 (Java) 본문

Algorithm

[프로그래머스 / Level1] 모의고사 (Java)

haehyun 2021. 11. 5. 19:37
728x90

문제

https://programmers.co.kr/learn/courses/30/lessons/42840?language=java 

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

 

핵심 키워드

  • 완전 탐색
  • 세 개의 값에서 최대값 구하기

 

풀이

  1. 수포자 3명 답안지 준비
    수포자 3명의 답안지 패턴을 파악한 뒤, 각 패턴을 배열로 선언한다.
  2. 채점
    answers 배열의 요소와 수포자1, 2, 3 배열의 요소를 하나씩 비교해 답이 맞을 경우, 점수(정답을 맞힌 개수) 카운트
  3. 최고 점수(가장 많이 맞힌 개수) 구하기
    Math.max() 함수를 사용해 수포자 3명의 점수 중 최대값을 구한다.
  4. 점수가 최고점수와 같은 수포자 추출
    위에서 구한 최고점수와 수포자 3명의 점수를 각각 비교했을 때, 점수가 같은 수포자는 리스트에 추가
    (마지막 return값인 가장 많은 정답을 맞힌 사람은 배열길이가 가변적이기 때문에 리스트로 작업)
  5. 최고 점수를 받은 수포자들 저장해둔 리스트를 배열로 변환해 반환

 

코드 (성공)

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(int[] answers) {        
        //답안지
        int[] student1 = { 1, 2, 3, 4, 5 };
        int[] student2 = { 2, 1, 2, 3, 2, 4, 2, 5 };
        int[] student3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };
        int[] scores = new int[3];
        
        //채점
        for(int i = 0; i < answers.length; i++){
            int answer = answers[i];
            if(answer == student1[i % student1.length]){ scores[0]++; }
            if(answer == student2[i % student2.length]){ scores[1]++; }
            if(answer == student3[i % student3.length]){ scores[2]++; }
        }
        
        //최고 점수(가장 많이 맞힌 개수) 구하기
        int topScore = Math.max(Math.max(scores[0], scores[1]), scores[2]);
        
        //최고 점수인 수포자 구하기
        List<Integer> students = new ArrayList<>();
        for(int i=0; i < scores.length; i++){
            if(topScore == scores[i]){
                students.add(i+1);
            }
        }
        
        //리스트 → 배열 변환
        return students.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

학습 내용

  • student1[0] = 1, student1[1] = 2, student1[2] = 3, student1[3] = 4, student1[4] = 5
    student1[5] = 1, student1[6] = 2, student1[7] = 3 과 같이 특정 패턴이 반복되는 배열이 필요할 시 모든 값을 저장해 둘 필요없이 반복 구간의 값만 배열에 저장해둔 뒤 => int[] student1 = {1, 2, 3, 4, 5}
    student1[i % student1.length] 와 같이 접근하려는 요소 인덱스 % 배열 길이의 나머지 값으로 접근한다.
    ex) i = 10일 경우, student1[10 % 5 = 0] = student1[0] = 1
        i = 11일 경우, student1[11 % 5 = 1] = student1[1] = 2
728x90
Comments