문제
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
풀이
단순하게 반복문을 통해서 문제를 푸는 문제다.
좀 더 시간을 줄여 효율성을 높일 수 있지만, 함수사용을 통해 가독성을 좋게 했다.
수포자 1,2,3 의 정답 찍는 방법을 모두 배열로 저장해놓고 함수를 통해 찾았다.
각각 수포자 마다 찍는 패턴의 길이가 다르므로 모듈러 연산(%) 을 통해 인덱스의 위치를 맞춰줬다.
<전체코드>
import java.util.*;
class Solution {
int[][] person = {{1, 2, 3, 4, 5} ,
{2, 1, 2, 3, 2, 4, 2, 5} ,
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
public int[] solution(int[] answers) {
int[] answer = {};
List<Integer> answer_List = new ArrayList<Integer>();
int max = 0;
for(int i = 0 ; i < person.length ; i++){
int count = count_Answer(answers, person[i]);
if(i == 0 ){
max = count;
answer_List.add(i+1);
}
else if(max < count){
max = count;
answer_List.clear();
answer_List.add(i + 1);
}
else if(max == count){
answer_List.add(i + 1);
}
}
answer = new int[answer_List.size()];
for(int i = 0 ; i < answer_List.size(); i++){
answer[i] = answer_List.get(i);
}
return answer;
}
public int count_Answer(int[] answers, int[] person){
int j = 0;
int answer = 0;
for(int i = 0 ; i < answers.length ; i++, j++){
j %= person.length;
if(answers[i] == person[j])
answer++;
}
return answer;
}
}
'알고리즘 공부 > 완전탐색' 카테고리의 다른 글
백준 1759 (암호 만들기) - 조합알고리즘 (0) | 2021.04.14 |
---|---|
백준 2447 (별 찍기 -10) (0) | 2021.04.14 |
프로그래머스 완전탐색 Level 2 (카펫) (0) | 2021.04.07 |
프로그래머스 완전탐색 Level 2 (소수 찾기) (0) | 2021.04.06 |
순열, 조합, 부분집합, 멱집합 정리 (0) | 2021.04.06 |