[프로그래머스] 파트4.6장 완전탐색 - 모의고사

은지일·2023년 9월 27일
0

알고리즘

목록 보기
16/17
post-thumbnail

1. 문제

프로그래머스 - 모의고사

  • 1번에서 3번 수포자까지 각각 문제를 찍는 방식이 주어지고
  • 정답이 순서대로 들은 배열 answers가 주어졌을 때
  • 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 반환하는 문제

2. 초기 풀이

  • answer를 완전 탐색하면서 각 수포자가 찍는 방식에 따라 맞춘 정답의 개수를 구하는 것은 쉬웠다.
  • 나머지 연산자를 이용하여 각 수포자의 찍는 방식을 반복하도록 구현
  • 4번 부분에서, 동점인 경우 리턴해야할 배열이 동적으로 변하기 때문에 어떻게 처리할지 고민
  • ArrayList에 최대값과 같은 수포자의 번호를 저장하고, int[] 타입으로 변환하여 문제 해결
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] answers) {
        // 1. 1번에서 3번 수포자의 찍는 방식을 저장한 배열 m1 ~ m3
        int[] m1 = {1, 2, 3, 4, 5};
        int[] m2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] m3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        // 2. 각 수포자가 맞춘 정답의 개수를 저장해줄 correct
        int[] correct = new int[3];
        
        // 3. answer를 순회하면서 각 수포자가 맞춘 정답의 개수를 correct에 기록
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == m1[i % m1.length]) correct[0]++; // 1번 수포자
            if (answers[i] == m2[i % m2.length]) correct[1]++; // 2번 수포자
            if (answers[i] == m3[i % m3.length]) correct[2]++; // 3번 수포자
        }
        
        // 4. 가장 많은 문제를 맞힌 사람을 int 배열에 담아 리턴
        // correct에서 가장 높은 점수 max
        int max = Arrays.stream(correct).max().getAsInt();
        
        // ArrayList list에 max와 같은 correct의 인덱스 + 1 추가(수포자 번호를 맞추기 위해서)
        List<Integer> list = new ArrayList<>();
        
        for (int i = 0; i < correct.length; i++) {
            if (correct[i] == max) list.add(i + 1);
        }
        
        // int[] 타입으로 변환 리턴
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

3. 개선 풀이

  • 위의 4번 부분을 조금 더 단순하게 개선하여 4, 5번으로 나눔
  • IntStream의 rangeClosed를 활용하여 리턴 배열을 동적으로 조절
import java.util.Arrays;
import java.util.stream.IntStream;

class Solution {
    public int[] solution(int[] answers) {
        // 1. 1번에서 3번 수포자의 찍는 방식을 저장한 배열 m1 ~ m3
        int[] m1 = {1, 2, 3, 4, 5};
        int[] m2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] m3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        // 2. 각 수포자가 맞춘 정답의 개수를 저장해줄 correct
        int[] correct = new int[3];
        
        // 3. answer를 순회하면서 각 수포자가 맞춘 정답의 개수를 correct에 기록
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == m1[i % m1.length]) correct[0]++; // 1번 수포자
            if (answers[i] == m2[i % m2.length]) correct[1]++; // 2번 수포자
            if (answers[i] == m3[i % m3.length]) correct[2]++; // 3번 수포자
        }
        
        // 4. correct에서 가장 높은 점수 max
        int max = Arrays.stream(correct)
        				.max()
                        .getAsInt();
        
        // 5. max와 동점인 수포자들을 IntStream을 활용하여 동적으로 리턴 
        return IntStream.rangeClosed(0, 2) // 최대 3명
                        .filter(i -> correct[i] == max) // max와 동점인 수포자들만 필터링
                        .map(i -> i + 1) // 수포자 번호에 맞게 인덱스 변환
                        .toArray(); // int[] 배열로 변환하여 리턴
    }
}
profile
항상 더 나은 방법을 찾는 백엔드 개발자 은지일입니다 :)

0개의 댓글