본문 바로가기
알고리즘

[프로그래머스 알고리즘문제] 모의고사 - JAVA

by oomm112 2021. 8. 5.

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

입출력 예

answersreturn

[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 static ArrayList<Integer> solution(int[] answers) {
		ArrayList<Integer> answer = new ArrayList<Integer>();
		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 check_a = 0 , check_b = 0 , check_c = 0;

		//a, b ,c 학생들이 답을 맞을 경우 check_이름 변수를 추가 시켜주는 반복문
		// 배열이름[i%배열이름.length] %는 나눈몫의 나머지를 나타내는 연산자이다. 
		for (int i = 0; i < answers.length; i++) {
			if (answers[i] == a[i%a.length]) {check_a++;}
			if (answers[i] == b[i%b.length]) {check_b++;}
			if (answers[i] == c[i%c.length]) {check_c++;}
		}

		//a, b ,c 학생들의 최대 맞은 갯수를 구한 값
		int max = Math.max(check_a,Math.max(check_b, check_c));

		if (check_a > check_b && check_a > check_c) {
			answer.add(1);
		}else if(check_b > check_a && check_b > check_c) {
			answer.add(2);
		}else if(check_c > check_a && check_c > check_b) {
			answer.add(3);
		}else {	
			if (max == check_a) {answer.add(1);}
			if (max == check_b) {answer.add(2);}
			if (max == check_c) {answer.add(3);}
		}

		return answer;
	}
}

1. int배열 a~c 까지는 각각 학생들이 찍는 번호들의 배열

2. check_a~check_c 까지 학생들이 맞은 갯수들을 저장할 정수변수

3.answer (ArrayList)는 답을 정해줄 Array리스트 [ 배열의 길이를 시작할떄 정하지 못하므로 Arraylist를 사용하였다]

 

A)for문은 answers(정답이 담겨있는 배열)의 길이만큼 반복하고 ,

if문으로 answers의 i번째 숫자가  (a~c)배열의 i%a.length만큼 일경우 (check_a~c)의 값을 증가시켜준다.

why? i%a.length??? 만약 a는 배열의 길이가 5인데 , 정답배열의 길이가 6을 넘을경우 NumberFormatException에러가 터진다.

이를 방지하기 위해 i가 만약 6일경우 a배열의 길이인 5를 나눈 나머지 값은 1이 나온다.

그럼 a의[1]번째 배열의 값을 가져올수 있어 에러가 터지지 않는다!

 

B)정수변수 max는 주석의 설명과 같이, Math함수를 이용하여 a~c의 맞은 갯수들의 최대값을 정한다.

why Math.max를 두번 사용한건지??  Math.max함수는 한번에 두개의 값만 비교 할수 있다. 그래서 Math.max를 두번 사용하여 각각 두개의 값을 비교할 수 있게 사용하였다.

 

C)If문으로 check_a가 b와 c보다 클경우 에는 answer(어레이리스트)에 1을 추가시켜준다.

밑의 else if 들도 마찬가지로 클경우 answer에 값을 추가시켜준다.

 

D)하지만, 위 세가지 조건들을 모두 만족하지 못하고 else로 넘어갈 경우

max함수(최대값)과 check_a~c 가 같을경우 answer에 값을 추가 시켜준다 

[이 if문들은 else if문이 아니기 때문에, 모든 if문을 돌게 된다.]

 

그 후 answer를 리턴해준다.

 

반응형

댓글