TIL

99클럽 코테 스터디 15일차 TIL (완전탐색)

malang J 2024. 8. 6. 01:34

문제


문제 해결

1. 정답 배열이 주어지면 각 수포자 학생들의 정답과 비교하여 점수를 낸다.

2. 점수배열에는 순서대로 1~3번 학생까지의 점수가 담겨져 있다.

3. 최대값을 추려내고 최대값을 가진 학생들을 List에 담는다.

나의 풀이 (개선 전)

class Solution {
    public int[] solution(int[] answers) {
        int[] student1 = {1, 2, 3, 4, 5, 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[] cnt = new int[3];

        for(int i = 0; i < answers.length; i++){
            if(answers[i] == student1[i % student1.length]){
                cnt[0]++;
            }

            if(answers[i] == student2[i % student2.length]){
                cnt[1]++;
            }

            if(answers[i] == student3[i % student3.length]){
                cnt[2]++;
            }
        }

        int maxScore = Math.max(cnt[0], Math.max(cnt[1], cnt[2]));
        List<Integer> results = new ArrayList<>();
        for(int i = 0; i < 3; i++){
            if(maxScore == cnt[i]){
                results.add(i + 1);
            }
        }

        return results.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

나의 풀이 (개선 후)

class Solution {
    private final int[][] patterns = {
        {1, 2, 3, 4, 5},
        {2, 1, 2, 3, 2, 4, 2, 5},
        {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
    };

    public int[] solution(int[] answers) {
        int[] cnt = new int[3];

        for(int i = 0; i < answers.length; i++){
            for(int j = 0; j < patterns.length; j++){
                if(answers[i] == patterns[j][i % patterns[j].length]){
                    cnt[j]++;
                }
            }
        }

        int maxScore = Math.max(cnt[0], Math.max(cnt[1], cnt[2]));
	List<Integer> results = new ArrayList<>();
        for(int i = 0; i < 3; i++){
            if(maxScore == cnt[i]){
                results.add(i + 1);
            }
        }

        return results.stream().mapToInt(Integer::intValue).toArray();
    }
}

int[] 배열을 각자 따로 선언한 것for문 내부 비슷한 if문 대한 피드백을 받았다.
따로 작성한 이유는,
제한 조건이 10^4이라 n^2이 되어버리면 시간초과 발생 이슈 때문이였고 for문 하나로 해결하려했다.

하지만, 이중 루프를 통해 O(n * m)으로 보일 수 있지만
학생은 고정으로 3명밖에 없어서 실질적으로 O(n)인 것이였다......!!

그리고 1,2,3번 학생 모두 찍은 답안들이 반복패턴을 보인다는 것을 알았다.
i % patterns[j].length 나머지연산을 사용해서 본인 답안을 반복되게 했다


회고

  • 이중루프 == n^2 라는 고정관념 버리자
  • 개선 전과 개선 후는 성능상 차이는 크게 없지만 하나의 습관을 만드는 것이다.
    - 역할이 크게 다르지 않다면 비슷해 보이는 코드 && 비슷한 역할을 하는 코드는 되도록 하나로 만들자.