[99클럽 코테 스터디_ DAY 15] 수포자

yewon·2024년 8월 6일
0

스터디

목록 보기
14/22
post-thumbnail

수포자

✏️오늘의 문제



💡나의 풀이


  public int[] solution(int[] answers) {
        int[] first = {1,2,3,4,5};
        int[] second = {2,1,2,3,2,4,2,5};
        int[] third = {3,3,1,1,2,2,4,4,5,5};

        int cnt1 = 0;
        int cnt2 = 0;
        int cnt3 = 0;

        for (int i=0; i<answers.length; i++) {
            if (answers[i] == first[i%5]) {
                cnt1++;
            }

            if (answers[i] == second[i%8]) {
                cnt2++;
            }

            if (answers[i] == third[i%10]) {
                cnt3++;
            }
        }

        if (cnt1 > cnt2 && cnt1 > cnt3) {
            int[] answer = new int[1];
            answer[0] = 1;
            return answer;
        } else if (cnt2 > cnt1 && cnt2 > cnt3) {
            int[] answer = new int[1];
            answer[0] = 2;
            return answer;
        } else if (cnt3 > cnt1 && cnt3 > cnt2) {
            int[] answer = new int[1];
            answer[0] = 3;
            return answer;
        } else if (cnt1 == cnt2 && cnt1 > cnt3) {
            int[] answer = new int[2];
            answer[0] = 1;
            answer[1] = 2;
            return answer;
        } else if (cnt2 == cnt3 && cnt2 > cnt1) {
            int[] answer = new int[2];
            answer[0] = 2;
            answer[1] = 3;
            return answer;
        } else if (cnt3 == cnt1 && cnt3 > cnt2) {
            int[] answer = new int[2];
            answer[0] = 1;
            answer[1] = 3;
            return answer;
        } else {
            int[] answer = new int[3];
            answer[0] = 1;
            answer[1] = 2;
            answer[2] = 3;
            return answer;
        }
    }

이 코드는 프로그래밍 문제인 "모의고사"를 해결하기 위한 풀이입니다. 주어진 답안(answers)에 대해 세 명의 수험생(1번, 2번, 3번)이 각각 몇 문제를 맞혔는지를 계산하고, 가장 많이 맞힌 수험생의 번호를 반환하는 방식입니다.

코드 설명

  1. 수험생의 답안 패턴 정의

    • first, second, third 배열은 각 수험생이 문제를 푸는 방식입니다. 각각 1번, 2번, 3번 수험생의 답안 패턴을 정의합니다.
  2. 정답 개수 카운트

    • cnt1, cnt2, cnt3 변수를 통해 각 수험생이 맞춘 문제 수를 카운트합니다.
    • for 루프를 사용하여 answers 배열을 순회하며 각 수험생의 패턴에 맞춰 정답을 비교하고 카운트합니다.
  3. 결과 반환

    • 각 수험생의 맞춘 문제 수를 비교하여 가장 높은 점수를 받은 수험생의 번호를 배열에 담아 반환합니다.
    • 동점인 경우, 해당 수험생들의 번호를 배열에 담아 반환합니다.

장점

  1. 명확한 구조: 코드가 명확하게 구조화되어 있어, 각 수험생의 답안 패턴과 카운트 과정이 쉽게 이해됩니다.

  2. 효율성: 입력 배열을 한 번만 순회하여 답을 계산하므로 시간 복잡도가 O(n)입니다. 이는 매우 효율적인 접근 방식입니다.

  3. 유연성: 수험생의 수나 답안 패턴을 변경하기 쉽습니다. 배열만 수정하면 추가적인 변경 없이도 확장할 수 있습니다.

단점

  1. 중복 코드: 결과를 반환하는 부분에서 중복 코드가 많이 발생합니다. 동점 검사와 반환하는 과정이 반복되고 있어, 코드가 길어지고 가독성이 떨어질 수 있습니다.

  2. 배열 크기 고정: 수험생의 수가 늘어나면 배열 크기를 동적으로 조정해야 하는데, 현재 구현은 이를 고려하지 않았습니다. 예를 들어, 수험생이 4명 이상일 경우 코드를 수정해야 합니다.

  3. 가독성: 조건문이 많아지면서 가독성이 떨어질 수 있습니다. 특히, 동점인 경우를 처리하는 조건문이 복잡해 보입니다.

개선 방안

  1. 동적 배열 사용: 수험생의 수를 동적으로 처리하기 위해 ArrayList와 같은 동적 배열을 사용할 수 있습니다.

  2. 중복 코드 제거: 결과 반환 부분을 함수로 분리하여 중복을 줄이고 가독성을 높일 수 있습니다.

  3. 주석 추가: 각 단계에 설명 주석을 추가하여 다른 사람이 코드를 이해하는 데 도움이 될 수 있습니다.


💡더 효율적인 코드

import java.util.ArrayList;
import java.util.List;

public int[] solution(int[] answers) {
    int[] first = {1, 2, 3, 4, 5};
    int[] second = {2, 1, 2, 3, 2, 4, 2, 5};
    int[] third = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    int[] counts = new int[3]; // 세 수험생의 정답 개수를 저장

    for (int i = 0; i < answers.length; i++) {
        if (answers[i] == first[i % first.length]) counts[0]++;
        if (answers[i] == second[i % second.length]) counts[1]++;
        if (answers[i] == third[i % third.length]) counts[2]++;
    }

    // 최대 점수를 찾기
    int maxCount = Math.max(counts[0], Math.max(counts[1], counts[2]));
    
    // 최대 점수를 가진 수험생 번호를 저장할 리스트
    List<Integer> resultList = new ArrayList<>();
    
    for (int i = 0; i < counts.length; i++) {
        if (counts[i] == maxCount) {
            resultList.add(i + 1); // 수험생 번호는 1부터 시작하므로 i + 1
        }
    }

    // 결과 리스트를 배열로 변환
    return resultList.stream().mapToInt(i -> i).toArray();
}

더 효율적이고 깔끔한 코드를 작성하기 위해, 중복을 줄이고 동적 배열을 활용하여 수험생의 수를 유연하게 처리하는 방법을 제안합니다. 아래 코드는 ArrayList를 사용하여 동점인 경우를 쉽게 처리하고, 결과 반환 부분을 간소화했습니다.

코드 설명

  1. 정답 카운트 배열: counts 배열을 사용하여 각 수험생의 맞춘 문제 수를 저장합니다. 이는 코드의 가독성을 높이고, 반복적인 변수를 줄입니다.

  2. 최대 점수 찾기: Math.max를 사용하여 최대 점수를 쉽게 찾습니다. 이로 인해 복잡한 조건문을 줄일 수 있습니다.

  3. 동적 결과 저장: ArrayList를 사용하여 동점인 수험생의 번호를 저장합니다. 이 방식은 수험생 수에 관계없이 유연하게 동작합니다.

  4. 결과 변환: 최종 결과를 ArrayList에서 배열로 변환하여 반환합니다. 이 과정은 Java 8의 스트림 기능을 사용하여 간결하게 처리됩니다.

장점

  • 간결성: 중복된 코드가 줄어들고, 가독성이 향상되었습니다.
  • 유연성: 수험생 수가 늘어나더라도 쉽게 확장할 수 있습니다.
  • 효율성: 각 수험생의 점수를 한번에 계산하고 최대 점수를 찾는 과정이 간단해졌습니다.

0개의 댓글