문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
입출력 예 설명
입출력 예 #1
- 수포자 1은 모든 문제를 맞혔습니다.
- 수포자 2는 모든 문제를 틀렸습니다.
- 수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
입출력 예 #2
- 모든 사람이 2문제씩을 맞췄습니다.
< (꼴보기도 싫은)나의 풀이 >
import java.util.ArrayList; class Solution { public int[] solution(int[] answers) { ArrayList<Integer> list = new ArrayList<>(); int[] student1 = new int[answers.length]; int[] student2 = new int[answers.length]; int[] student3 = new int[answers.length]; int temp = 1; int count1 = 0; int count2 = 0; int count3 = 0; for (int i = 0; i < answers.length; i++) { // studnet1 초기화 student1[i] = temp; temp++; if (temp == 6) temp = 1; } // end of studen1 temp = 1; for (int i = 0; i < answers.length; i++) { // studen2 초기화 if (i % 2 == 0 || i == 0) { student2[i] = 2; } else { student2[i] = temp; temp++; if (temp == 2) temp = 3; if (temp == 6) temp = 1; } } // end of student2 temp = 1; for (int i = 0; i < answers.length; i++) { // studen3 초기화 if (i == 0 || i == 1 || i % 10 == 0 || i % 10 == 1) { student3[i] = 3; } else if ((i == 2) || (i == 3) || (i % 10 == 2) || (i % 10 == 3)) { student3[i] = 1; } else if ((i == 4) || (i == 5) || (i % 10 == 4) || (i % 10 == 5)) { student3[i] = 2; } else if ((i == 6) || (i == 7) || (i % 10 == 6) || (i % 10 == 7)) { student3[i] = 4; } else if ((i == 8) || (i == 9) || (i % 10 == 8) || (i % 10 == 9)) { student3[i] = 5; } } // end of for // 비교 for (int i = 0; i < answers.length; i++) { if (answers[i] == student1[i]) count1++; if (answers[i] == student2[i]) count2++; if (answers[i] == student3[i]) count3++; } // 최종비교 if (count1 > count2 && count1 > count3) list.add(1); else if (count2 > count1 && count2 > count3) list.add(2); else if (count3 > count1 && count3 > count2) list.add(3); else if (count1 == count2 && count1 == count3) { list.add(1); list.add(2); list.add(3); } else if (count1 == count2 && count1 != count3) { list.add(1); list.add(2); } else if (count1 == count3 && count1 != count2) { list.add(1); list.add(3); } else if (count2 == count3 && count1 != count2) { list.add(2); list.add(3); } int[] answer = new int[list.size()]; for(int i = 0; i<list.size(); i++) { answer[i] = list.get(i); } return answer; } } |
굉장히 지저분 하고 효율성 떨어지고 흑역사가 될 것 같은 느낌이지만 어쨌든 풀긴 풀었다.
다시 보기도 머리아프고 볼 필요도 없을것 같아서 다시 안볼란다.
< 다른 사람의 풀이 1 >
import java.util.ArrayList; class Solution { public int[] solution(int[] answer) { int[] a = {1, 2, 3, 4, 5}; int[] b = {2, 1, 2, 3, 2, 4, 2, 5}; int[] c = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; int[] score = new int[3]; for(int i=0; i<answer.length; i++) { if(answer[i] == a[i%a.length]) {score[0]++;} if(answer[i] == b[i%b.length]) {score[1]++;} if(answer[i] == c[i%c.length]) {score[2]++;} } int maxScore = Math.max(score[0], Math.max(score[1], score[2])); ArrayList<Integer> list = new ArrayList<>(); if(maxScore == score[0]) {list.add(1);} if(maxScore == score[1]) {list.add(2);} if(maxScore == score[2]) {list.add(3);} return list.stream().mapToInt(i->i.intValue()).toArray(); } } |
수포자 a,b,c의 찍기 패턴을 미리 배열로 정의하고 순서대로 비교하는 방식인 듯 싶다.
for(int i=0; i<answer.length; i++) {
if(answer[i] == a[i%a.length]) {score[0]++;}
: a.length = 5이고 반복문이 돌며 a[0]부터(5%5)~4까지의 값이 비교된다.
나머도 각 수포자 찍기패턴 배열의 length만큼 반복문을 통해 [0]~부터 반복하며 answer과 비교하게끔 짜여져 있다.
answer과 일치할 경우 score가 카운트된다.
int maxScore = Math.max(score[0], Math.max(score[1], score[2]));
: Math 클래스는 처음 공부할 적 난수이용할 때 처음 접하고 이후로 처음이다.
max메소드는 대충 서치해보니
*Math.max(x, y) - x 와 y 중 큰 수 리턴
결국 score[1]과 score[2]에서의 max값과 score[0]에서의 max값을 비교해 최댓값을 리턴하게 된다.
if(maxScore == score[0]) {list.add(1);}
if(maxScore == score[1]) {list.add(2);}
if(maxScore == score[2]) {list.add(3);}
return list.stream().mapToInt(i->i.intValue()).toArray();
steam().mapToInt..난생 처음음보는 건데 나중에 다시볼것.
어쨌든 ArrayList를 배열로 만들어주는 것 같다.
내 코드의
int[] answer = new int[list.size()];
for(int i = 0; i<list.size(); i++) {
answer[i] = list.get(i);
}
와 비슷한 역할이겠지.
< 새로 알게 된 것 >
반복문의 i값을 배열기로 나누어 각 원소들을 비교하게 하는 방법.
-더 공부해야 될 것 : steam()
'Tech > Algorithm' 카테고리의 다른 글
프로그래머스)level.1_소수 찾기(에라토스테네스의 체) (0) | 2019.04.04 |
---|---|
프로그래머스)level.1_하샤드 수 (0) | 2019.04.03 |
프로그래머스)level.1_완주하지 못한 선수(hash 공부하고 쓸것) (0) | 2019.04.03 |
프로그래머스)level.1_k번째 수 (0) | 2019.04.03 |
프로그래머스)level.1_문자열 다루기 기본 (0) | 2019.04.03 |
댓글