본문 바로가기
Tech/Algorithm

프로그래머스)level.1_모의고사

by 소라소라잉 2019. 4. 3.

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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()

댓글