🌘문제 이해하기
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번 수포자는 1~5를 순서대로 찍는다.
- 2번 수포자는 2, 1, 2, 3, 2, 4, 2, 5 순서대로 찍는다.
- 3번 수포자는 3-1-2-4-5 순서로 두번씩 찍는다
수포자들의 찍는 방식을 각 배열에 저장하고 반복한다.
각 수포자들의 찍은 답과 anwers 배열의 답을 비교하여 점수를 매기고 점수의 최대값을 구한다.
🌗문제 자세히보기
정답 순서가 저장되어 있는 answer 과 수포자들의 찍는 방식을 비교하여 정답인 수포자에게 점수를 부여한다.
1.수포자들의 찍는 방식을 배열에 저장한다.
int[] first = new int[]{1, 2, 3, 4, 5}; //5개로 찍는 1번 수포자
int[] second = new int[]{2, 1, 2, 3, 2, 4, 2, 5};//8개로 찍는 2번 수포자
int[] third = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};//10개로 찍는 3번 수포자
2.수포자들의 점수를 저장할 배열을 생성하고 answer 과 비교하며 점수를 부여한다.
수포자들의 찍는 방식이 다 다른데 이를 규칙적이게 돌리기 위해 나머지(%) 를 사용한다.
예를 들어 9번제 문제면 아래 빨간색 숫자로 찍어야 한다.
first = 1, 2, 3, 4, 5, 1, 2, 3, 4
secod = 2, 1, 2, 3, 2, 4, 2, 5, 2
third = 3, 3, 1, 1, 2, 2, 4, 4, 5
하지만 첫번째는 5개씩 찍고 , 두번째는 8번씩 , 세번재는 10번씩 찍는다.
위의 규칙들이 계속돌아가기 위해서는 나머지 방식을 사용하면 된다.
9%5 = 4 > int[] first = new int[]{1, 2, 3, 4, 5};
9%8 = 1 > int[] second = new int[]{2, 1, 2, 3, 2, 4, 2, 5};
9%10=9 > int[] third = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
//수포자들의 각 점수
int[] score = {0,0,0};
for(int i=0;i<answers.length;i++)
{
if(answers[i] == first[i%5]) score[0]++;
if(answers[i] == second[i%8]) score[1]++;
if(answers[i] == third[i%10]) score[2]++;
}
3. 가장 큰 점수를 가진 수포자를 구한다.
int maxScore = Math.max(score[0] , Math.max(score[1],score[2]));
4. 가장 큰 점수를 가진 수포자를 저장한다.(동일 점수면 동일한 수포자 모두)
//점수가 높은 수포자만 따로 저장
List<Integer> supojaList = new ArrayList<>();
for(int i=0;i<score.length;i++)
{
if(score[i] == maxScore)
{
supojaList.add(i+1);
}
}
5. list 에 담긴 수포자들은 answer 배열에 다시 저장
🌕 최종코드
import java.util.*;
public static int[] solution(int[] answers)
{
int[] first = new int[]{1, 2, 3, 4, 5}; //5개로 찍는 1번 수포자
int[] second = new int[]{2, 1, 2, 3, 2, 4, 2, 5};//8개로 찍는 2번 수포자
int[] third = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};//10개로 찍는 3번 수포자
//수포자들의 각 점수
int[] score = {0,0,0};
for(int i=0;i<answers.length;i++)
{
if(answers[i] == first[i%5]) score[0]++;
if(answers[i] == second[i%8]) score[1]++;
if(answers[i] == third[i%10]) score[2]++;
}
//최대 점수 확인하기
int maxScore = Math.max(score[0] , Math.max(score[1],score[2]));
//점수가 높은 수포자만 따로 저장
List<Integer> supojaList = new ArrayList<>();
for(int i=0;i<score.length;i++)
{
if(score[i] == maxScore)
{
supojaList.add(i+1);
}
}
int[] answer = new int[supojaList.size()];
for(int s=0; s<supojaList.size(); s++)
{
answer[s] = supojaList.get(s);
}
return answer;
}
'항해' 카테고리의 다른 글
[Day22]JAVA 프로그래머스 피로도(완전탐색) (1) | 2024.11.18 |
---|---|
[Day21]JAVA 프로그래머스 카펫(완전탐색) (6,7,8,9 만 오류인 경우) (0) | 2024.11.17 |
[Day19]JAVA 백준 강의실(1374번) (1) | 2024.11.15 |
[Day18]JAVA 백준 센서(2212번) (0) | 2024.11.14 |
[Day17]JAVA 백준 밤양갱(31926번) (0) | 2024.11.13 |