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, ...
해당 패턴으로 학생이 문제를 찍었을때 어느 학생이 가장 많이 맞췄는지 찾아내는 문제다.
가장 많은 정답의 수를 찾고 끝나는게 아닌
가장 많은 정답의 수를 찾고 해당 값의 주인을 을 찾아 출력하는것
- 찍는 패턴과 정답지를 비교해 각 학생별 정답의 수를 찾는다.
- 각 학생별 정답의 수 들중 가장 많은 정답의 수를 찾는다.
- 각 학생별 정답의 수 들과 가장 많은 정답의 수를 비교하며 몇번째 값이 제일 큰지 찾는다.
- 찾은 제일 큰 순서의 값을 출력한다.
코딩 하기전 이렇게 정리를 하고 문제를 풀었다.
- count[0] > count[1] 를 비교하고
- 참 일 경우 count[0] 과 [2] 를 비교
- 거짓을 경우 [1] 과 [2] 를 비교하여 가장 큰 값을 획득
- 가장 큰 값을 획득
완전 단순하게 가장 큰 값을 찾는 방식으로 했다
package ***;
import java.util.ArrayList;
import java.util.Arrays;
public class *** {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
int[] answer = { 1, 2, 3, 4, 5 };
int[] su1 = { 1, 2, 3, 4, 5 };
int[] su2 = { 1, 2, 3, 4, 5, 1, 2, 3 };
int[] su3 = { 1, 2, 3, 1, 2, 1, 2, 3, 4, 5 };
int[] count = { 0, 0, 0 };
// answer 와 Su를 비교하여 일치하는 숫자 만큼 count[i] 증가
for (int i = 0; i < answer.length; i++) {
if (Su1[i % 5] == answer[i]) {
count[0]++;
}
if (Su2[i % 8] == answer[i]) {
count[1]++;
}
if (Su3[i % 10] == answer[i]) {
count[2]++;
}
}
// count[] 의 길이 만큼 arr을 생성후 내용 복사
int[] arr = new int[count.length];
for (int i = 0; i < count.length; i++) {
arr[i] = count[i];
}
// 복제한 arr[]을 많이 맞힌 순으로 오름차순 정렬
Arrays.sort(arr);
// 오름차순 정렬시 arr[2]에 제일 큰 값이 위치하게 된다.
// 이후 count[i] 를 차례로 arr[2] 와 비교하여 제일 큰 i번째 값을 찾아 낸뒤
// list에 i 값 저장.
for (int i = 0; i < arr.length; i++) {
if (count[i] == arr[2]) {
list.add(i + 1);
}
}
System.out.println(list);
}
}
최종 풀이다. count 를 찾는것 까진 동일하고
- count와 똑같은 배열 arr를 선언하고 데이터를 복사한다.
- arr을 오름차순 정렬한다.
- 마지막에 있는 값이 가장 큰 값이다.
- count[i]와 차례로 비교해 가장 큰 값의 순서를 찾고 list에 저장한다.
가장 큰 값을 찾아내는 부분에서 차이가 있다.
- int max = Math.max(Math.max(a, b), c);
Math.max를 두 번 사용해 제일 큰 값을 찾는다.
-> 왜 이걸 생각을 못했을까...
- int[] count = { 0, 0, 0 }; --> int a = 0, b = 0 , c = 0;
배열로 처리 할 경우 하나 하나 돌면서 처리해 느리다.
그냥 하나 씩 선언해 저장한 다음 돌리는게 더 빠르다.