-
프로그래머스 > 완전탐색 > 모의고사기타/알고리즘 2021. 9. 22. 21:33
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
answers return [1,2,3,4,5] [1] [1,3,2,4,2] [1,2,3] 아래 코드는 절반만 통과
public static int[] solution(int[] answers) { int hit1=0, hit2=0, hit3=0; int [] num1 = { 1, 2, 3, 4, 5}; int [] num2 = { 2, 1, 2, 3, 2, 4, 2, 5}; int [] num3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; int num1Len = num1.length; int num2Len = num2.length; int num3Len = num3.length; int len = answers.length; for(int i=0;i<len;i++){ if(num1[i%num1Len]==answers[i]){ hit1++; } if(num2[i%num2Len]==answers[i]){ hit2++; } if(num3[i%num3Len]==answers[i]){ hit3++; } } int [] answer = {hit1,hit2,hit3}; Arrays.sort(answer); List<Integer> list = new ArrayList<>(); for(int i=0;i<answer.length;i++){ if(answer[i]>=answer[answer.length-1]){ list.add(i+1); } } int[] finalarr = new int[list.size()]; for(int i = 0; i < list.size(); i++){ finalarr[i] = list.get(i); } return finalarr; }
아래 코드는 100% 통과..
위에서 정답 맞춘 수를 가진 answer {5,5,4} 를 정렬하고 {4,5,5} 가 됐을 때 가장 큰 수인 answer[2]와 비교할 대상을
answer 로 잡은 것이 잘못된 생각이였다.
정렬한 것은 max 점수를 갖기 위한 것일 뿐, 정렬 전 {5,5,4}는 학생1,학생2,학생3 각각의 스코어기 때문에 학생들 점수는 따로 copy 해 놓고 비교 대상으로 삼아야한다.
public static int[] solution(int[] answers) { int hit1=0, hit2=0, hit3=0; int [] num1 = { 1, 2, 3, 4, 5}; int [] num2 = { 2, 1, 2, 3, 2, 4, 2, 5}; int [] num3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; int num1Len = num1.length; int num2Len = num2.length; int num3Len = num3.length; int len = answers.length; for(int i=0;i<len;i++){ if(num1[i%num1Len]==answers[i]){ hit1++; } if(num2[i%num2Len]==answers[i]){ hit2++; } if(num3[i%num3Len]==answers[i]){ hit3++; } } int [] answer = {hit1,hit2,hit3}; Arrays.sort(answer); List<Integer> list = new ArrayList<>(); for(int i=0;i<answer.length;i++){ if(answer[i]>=answer[answer.length-1]){ list.add(i+1); } } int[] finalarr = new int[list.size()]; for(int i = 0; i < list.size(); i++){ finalarr[i] = list.get(i); } return finalarr; }
처음에는 % 를 이용해 비교할 생각을 못하고
매개변수 answer 의 길이만큼 학생 답안 패턴 길이를 늘이려고 했다.
몇 개 소수 문제 빼고 모두 시간 초과를 받았다.
public int[] solution2(int[] answers) { int hit1=0; int hit2=0; int hit3=0; List<Integer> list1 = Arrays.asList(1,2,3,4,5); //List.of(1,2,3,4,5);UnsupportedOperationException / (ImmutableCollections.java:71) while(list1.size()<answers.length) { List<Integer> result = new ArrayList<>(); result.addAll(list1); list1 = result ; } List<Integer> list2 = Arrays.asList(2,1,2,3,2,4,2,5); while(list2.size()<answers.length) { List<Integer> result = new ArrayList<>(); result.addAll(list2); list2 = result ; } List<Integer> list3 = Arrays.asList(3,3,1,1,2,2,4,4,5,5); while(list3.size()<answers.length) { List<Integer> result = new ArrayList<>(); result.addAll(list3); list3 = result ; } for(int i=0;i<answers.length;i++ ) { if(answers[i]==list1.get(i)) { hit1++; } if(answers[i]==list2.get(i)) { hit2++; } if(answers[i]==list3.get(i)) { hit3++; } } List<Integer> ans = new ArrayList<>(); if(hit1>0) { ans.add(1); } if (hit2>0) { ans.add(2); } if (hit3>0) { ans.add(3); } int [] answer = ans.stream().mapToInt(Integer::intValue).toArray(); return answer; }
반응형