프로그래머스 - 모의고사 - 완전 탐색 - Java

chaemin·2024년 4월 12일
0

프로그래머스

목록 보기
16/64

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42840

2. 풀이

처음에는 answers의 length만큼 각 수포자의 정답 경우의 수를 구해서 풀려고 했다. 하지만 잘 생각해보니 반복은 %로 풀이 가능하다 라는걸 생각해냈다.

  • answer길이가 최대 10,000이기 때문에 수포자 3명을 완탐해도 시간초과가 발생하지 않는다.
  1. 수포자별 반복 rule을 배열에 담아준다.
int[][] rules = {{1, 2, 3, 4, 5}, 
				{2, 1, 2, 3, 2, 4, 2, 5},
				{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
  1. answers의 정답을 각 수포자를 돌면서 확인한다.
for(int i = 0; i < answers.length; i++) {
	for(int j = 0; j < 3; j++) {
		if(answers[i] == getAnswer(i, j)) {
			count[j] += 1;
			if(max < count[j]) {
				max = count[j];
			}
		}
	}
}
  1. 각 수포자의 정답은 getAnswer메소드를 사용하여 구한다.
public static int getAnswer(int problem, int person) {
	int rule[] = rules[person];
	return rule[problem % rule.length];
}

✨문제는 이 부분이다.

🚨"가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요."

  1. 해당 부분은 list에 담아서 다시 배열로 전환하는 방법도 있지만, 여기서는 IntStream을 사용해서 전환해본다.
final int maxCount = max;
int answer[] = IntStream.range(0, 3)
				.filter(i -> count[i] == maxCount)
				.map(i -> i+1)
				.toArray();

람다, 혹인 익명 메서드로 전달되는 메서드에서 외부변수를 참조할 때는 해당 변수 값을 수정하면 안되기 때문에 ✨final 키워드로 다시한번 선언해준다.


3. 전체코드

import java.util.*;
import java.util.stream.IntStream;

class Solution {
    int[][] rules = {{1, 2, 3, 4, 5}, 
                     { 2, 1, 2, 3, 2, 4, 2, 5}, 
                     {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
    
    int[] count = new int[3];
    
    public int[] solution(int[] answers) {
        
        int max = 0;
        
        for(int i = 0; i < answers.length; i++){
            for(int j = 0; j < 3; j++){
                if(answers[i] == getCount(i, j)){
                    count[j] += 1;
                    
                    if(max < count[j]){
                        max = count[j];
                    }
                }
            }
        }
        
        final int maxCount = max;
        int[] answer = IntStream.range(0, 3)
                                .filter(i -> count[i] == maxCount)
                                .map(i -> i+1)
                                .toArray();
        return answer;
    }
    
    public int getCount(int problem, int person){
        int rule[] = rules[person];
        
        return rule[problem % rule.length];
    }
}

0개의 댓글