본문 바로가기

기록/알고리즘

[프로그래머스] 모의고사

SMALL

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

 

class Solution {
    public int[] solution(int[] answers) {
        int[] student1 = {1, 2, 3, 4, 5};
		int[] student2 = {2, 1, 2, 3, 2, 4, 2, 5};
		int[] student3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

		int[] result = new int[3];
		for(int i = 0; i < answers.length; i++) {
			int a = answers[i];

			if(student1[i % student1.length] == a) {
				result[0]++;
			}
			if(student2[i % student2.length] == a) {
				result[1]++;
			}
			if(student3[i % student3.length] == a) {
				result[2]++;
			}
		}
		int max = 0;
        int total = 0;
		
		for(int a : result) {
			if (max < a) {
				max = a;
			}
		}
		int index = 0;
		for(int i = 0; i < result.length; i++) {
			if(result[i] == max) {
                total++;
			}
		}
        int[] answer = new int[total];
        for(int i = 0; i < result.length; i++) {
            if(result[i] == max) {
                answer[index++] = i + 1;
            }
        }
		return answer;
		
        
    }
}

 

세 학생의 맞은 개수를 세고, 최대점수를 구한 후 배열 크기를 할당하여 오름차순으로 배열에 넣어 return 하도록 구현했다.

문제를 풀면서도 몇가지 마음에 안드는 부분이 있었던 부분을 다른사람의 풀이를 통해서 해소하게 되어 정리해본다.

 


1. 변수명

위에 학생들의 점수 패턴을 넣은 배열을 각각 student1, student2, student3이라고 했다.

이 경우 반복문 내에서도 지저분하게 반복되며, 학생이 추가될 경우에 변수를 계속 이름을 다르게 할당해야한다는 단점이 있다.

 

-> 2차원 배열로 작성

//---- 기존 방식 -----
int[] student1 = {1, 2, 3, 4, 5};
int[] student2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] student3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
		
//---- 변경 후 -----
int[][] pattern =  {
		{1, 2, 3, 4, 5},
		{2, 1, 2, 3, 2, 4, 2, 5}
        {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};

변경 후에는 일일히 변수명을 가지고 다른 메소드를 사용하지 않고, 위치를 통해 접근할 수 있기 때문에 일반화를 할 수 있다.

 

2. 배열 동적 할당 계산

기존 코드에서는 최댓값 구하기 -> 해당하는 인원수 구하기 -> 동적할당 -> 해당하는 학생 배열에 넣기 과정으로, 총 3번에 반복되는 구간이 있었다. 이 경우에는 리스트로 해소할 수 있었다.

 

int max = Math.max(hit[0], Math.max(hit[1], hit[2]));
List<Integer> list = new ArrayList<>();
for(int i = 0; i < hit.length; i++)
	if(max == hit[i]) list.add(i + 1);

최댓값은 java.util.Math를 활용하여 구하고, list.add를 통해 가장 많이 맞춘 학생을 넣는다. 이후에 동적으로 배열을 생성하여 다시 값을 넣어주기만 하면 된다. 

SMALL