수포자들이 문제를 찍는 규칙이 반복적이기 때문에 배열에 각 수포자들의 규칙을 담고 반복문을 활용하여 답과 일치하는지 확인했다. 그리고 수포자들이 맞힌 문제의 개수를 순서대로 answer
배열에 담고 거기서 max
값을 구했다. 그리고 그 max
값과 다시 answer
배열의 요소들을 비교해서 같은 것들만 result
배열에 순서대로 넣엇다. 리턴할때는 result
배열의 크기가 3으로 정해져있고 빈 곳은 0으로 초기화되어 있기때문에 이런 필요없는 것들을 잘라내기 위해 Arrays.copyOfRange
를 사용했다.
수포자들이 맞은 문제의 개수를 세는건 괜찮은것 같은데 max값을 구하는것부터 뭔가 더 효율적인 방법이 없나 싶었다. 다른사람들이 작성한 코드를 봤는데 max값을 Math.max
메서드를 이용하는 것 외에는 거의 비슷했다.
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] answer= new int[3] ; //수포자들의 맞은 답 개수 저장
int max=0; //맞은 최대 개수 저장
int result[] = new int[3]; //제일 많이 맞은 사람 저장
//수포자1
int wrong_ans1[] = {1,2,3,4,5}; //수포자1의 규칙
int idx1=0;
for (int i=0;i<answers.length;i++) {
if (idx1==5)
idx1=0;
if(answers[i]==wrong_ans1[idx1]) //답 맞음
answer[0]++; //맞은개수 플러스
idx1++; //인덱스 플러스
}
//수포자2
int wrong_ans2[] ={2,1,2,3,2,4,2,5};
int idx2 = 0;
for (int i=0;i<answers.length;i++) {
if (idx2==8)
idx2=0;
if (wrong_ans2[idx2]==answers[i])
answer[1]++;
idx2++;
}
//수포자3
int wrong_ans3[] = {3,3,1,1,2,2,4,4,5,5};
int idx3=0;
for (int i=0;i<answers.length;i++) {
if(idx3==10) {
idx3=0;
}
if (answers[i]==wrong_ans3[idx3]) {
answer[2]++;
}
idx3++;
}
for (int i=0;i<3;i++) {
if (max<answer[i]) {
max=answer[i];
}
} //맞은 최대개수 구하기
int idx=0;
for (int i=0;i<answer.length;i++) {
if(max==answer[i]) {
result[idx]=i+1;
idx++;
}
} //맞은 개수가 제일많은 사람을 배열에 담기
return Arrays.copyOfRange(result,0,idx);
}
}
배열의 필요없는 부분을 자르려고 Arrays.copyOfRange
에 대해 찾아보았다. 이 메서드는 복사할 배열의 인덱스를 직접 지정할 수 있다.
Arrays.copyOfRange(arr,start,end)
arr : 복사할 배열
start : 복사를 시작할 인덱스
end : 복사가 끝날 인덱스
특정 범위가 아니라 배열의 첫부분부터 복사하려면
Arrays.copyOf(arr,length)
메서드를 사용할 수도 있다.
가장 보편적인 배열복사(인덱스 지정X) 방법은 arr.clone()
이다.
배열을 특정위치에 복사해오고 싶다면 System.arraycopy(a,a_start_idx,b,b_start_idx,length)
를 사용한다.
a : 복사할 배열
b : 붙여넣을 배열
이중for문
을 이용해서 배열을 복사할 수도 있다.