프로그래머스: 모의고사

kgh128·2023년 2월 12일

코드: https://github.com/kgh128/Problem-Solving/blob/main/src/Programmers/%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC.java


1. 수포자 답안지 배열 만들기

정답과 수포자의 답안을 비교해야 하므로, 수포자들의 답안지를 배열로 만든다. 수포자들의 답안은 반복되므로, 반복되는 구간만 배열로 저장한다.

int[] answers1 = {1, 2, 3, 4, 5};
int[] answers2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] answers3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

2. 채점하기

정답 배열과 수포자의 답안 배열을 비교하여 채점한다. 각 수포자 답안마다 반복괴는 구간이 존재한다.

  • 1번 수포자: 1, 2, 3, 4, 5 -> 총 5개
  • 2번 수포자: 2, 1, 2, 3, 2, 4, 2, 5 -> 총 8개
  • 3번 수포자: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 -> 총 10개

각 배열을 돌 때 끝까지 돌았으면 다시 배열의 앞으로 돌아와야 하므로 나머지를 이용하여 수포자의 답안에 접근한다. 1번 수포자의 반복 구간의 길이는 5이므로 i%5로 접근하고, 2번 수포자는 i%8로, 3번 수포자는 i%10으로 접근한다. 그러면 반복되는 답안으로 계속 채점할 수 있다.

for (int i = 0; i < answers.length; i++) {
	if (answers[i] == answers1[i%5]) score1++;
	if (answers[i] == answers2[i%8]) score2++;
	if (answers[i] == answers3[i%10]) score3++;
}

3. 최고점 구하기

Math.max() 메소드를 이용하여 수포자 3명의 점수 중에서 최고점을 구한다. Math.max() 메소드를 겹쳐서 사용한다.

int maxScore = Math.max(score1, Math.max(score2, score3));

4. 최고점에 해당하는 수포자 구하기

3에서 구한 최고점을 가지고 있는 수포자를 answer 리스트에 추가한다. 배열이 아닌 ArrayList를 사용한 이유는 다음과 같다. 최고점을 가진 사람들의 수를 모르기 때문에 배열의 길이를 고정할 수가 없다. 따라서 가변 배열인 ArrayList를 사용하여 리스트에 최고점자를 추가하는 형식을 사용하였다.

ArrayList<Integer> answer = new ArrayList<>();

if (score1 == maxScore) answer.add(1);
if (score2 == maxScore) answer.add(2);
if (score3 == maxScore) answer.add(3);

5. 결과 반환하기

코드 내에서는 ArrayList를 사용하였지만, 결과 반환은 int 배열로 해야한다. 따라서 stream()을 이용하여 ArrayList를 배열로 변환하였다. primitive 타입인 int 배열로 변환하는 것이므로 toArray() 메소드를 바로 사용할 수 없고, mapToInt() 메소드를 먼저 사용해야 한다.

return answer.stream().mapToInt(i->i).toArray();

stream에 대해서는 더 공부할 필요가 있을 것 같다.

0개의 댓글