[2주차 기본문제 2] 모의고사

BossTeemo·2024년 6월 28일
0

알고리즘스터디

목록 보기
6/19
post-thumbnail
post-custom-banner

모의고사


문제 설명

수포자는 수학을 포기한 사람을 의미하며, 세 명의 수포자가 모의고사에서 문제를 전부 찍으려고 합니다. 이들은 각기 다른 방식으로 문제를 찍습니다. 각 수포자의 찍기 패턴은 다음과 같습니다:

  1. 1번 수포자: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
  2. 2번 수포자: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
  3. 3번 수포자: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들어있는 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람을 배열에 담아 반환하는 함수 solution을 작성해야 합니다.

제한 조건

  • 시험은 최대 10,000 문제로 구성됩니다.
  • 문제의 정답은 1, 2, 3, 4, 5 중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여러 명일 경우, 오름차순으로 정렬하여 반환합니다.

입출력 예시

  • 예시 1:
    • answers: [1, 2, 3, 4, 5]
    • 결과: [1]
  • 예시 2:
    • answers: [1, 3, 2, 4, 2]
    • 결과: [1, 2, 3]

나의 풀이

function solution(answers) {
    // 각 수포자가 찍는 패턴을 정의합니다.
    const pattern1 = [1, 2, 3, 4, 5];
    const pattern2 = [2, 1, 2, 3, 2, 4, 2, 5];
    const pattern3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    
    // 수포자별로 맞힌 문제 수를 저장할 배열을 초기화합니다.
    const score = [0, 0, 0];
    
    // 각 문제에 대해 각 수포자의 정답을 비교하여 맞힌 문제 수를 계산합니다.
    for (let i = 0; i < answers.length; i++) {
        if (answers[i] === pattern1[i % pattern1.length]) {
            score[0]++;
        }
        if (answers[i] === pattern2[i % pattern2.length]) {
            score[1]++;
        }
        if (answers[i] === pattern3[i % pattern3.length]) {
            score[2]++;
        }
    }
    
    // 가장 높은 점수를 찾습니다.
    const maxScore = Math.max(...score);
    
    // 가장 높은 점수를 받은 수포자를 배열에 담아 반환합니다.
    const result = [];
    for (let i = 0; i < score.length; i++) {
        if (score[i] === maxScore) {
            result.push(i + 1);
        }
    }
    
    return result;
}

// 입출력 예시 테스트
console.log(solution([1, 2, 3, 4, 5])); // 출력: [1]
console.log(solution([1, 3, 2, 4, 2])); // 출력: [1, 2, 3]

GPT 활용 코드 평가

문제 조건 준수

  1. 행과 열의 길이: 문제의 크기(최대 10,000개)를 처리할 수 있도록 고려되었습니다.
  2. 원소의 범위: 문제의 정답이 1, 2, 3, 4, 5인 경우를 처리합니다.
  3. 유효한 입력: 입력이 항상 유효함을 가정하고 코드를 작성했습니다.

코드 평가

알고리즘 코딩 테스트의 관점에서 평가하면 다음과 같습니다:

1. 시간 복잡도

  • 각 수포자의 패턴에 따라 정답을 비교하는데 걸리는 시간은 O(n)입니다. 여기서 n은 문제의 개수입니다. 최악의 경우에도 실행 시간이 허용 범위 내에 있을 것입니다.

2. 공간 복잡도

  • 추가적인 공간은 주로 점수를 저장하는 배열과 결과를 저장하는 배열에 사용됩니다. 공간 복잡도는 O(1)입니다.

3. 정확성

  • 각 수포자의 패턴에 따라 정답을 정확히 비교하고 점수를 계산합니다.
  • 여러 테스트 케이스에 대해 올바른 결과를 반환합니다.

4. 효율성

  • 제한 조건 내에서는 매우 효율적입니다. 입력 크기가 커질수록 성능 저하 없이 처리할 수 있습니다.

5. 코드 가독성

  • 변수 이름과 루프 구조가 명확하여 이해하기 쉽습니다.
  • 주석을 추가하여 코드의 가독성을 높였습니다.

개선 방안

  • 입력 배열의 유효성을 확인하는 추가 검사를 통해 코드를 더 견고하게 만들 수 있습니다.
  • 주석을 추가하여 코드의 가독성을 높일 수 있습니다.

최종적으로, 개선된 코드는 다음과 같습니다:

function solution(answers) {
    // 각 수포자가 찍는 패턴을 정의합니다.
    const pattern1 = [1, 2, 3, 4, 5];
    const pattern2 = [2, 1, 2, 3, 2, 4, 2, 5];
    const pattern3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    
    // 수포자별로 맞힌 문제 수를 저장할 배열을 초기화합니다.
    const score = [0, 0, 0];
    
    // 각 문제에 대해 각 수포자의 정답을 비교하여 맞힌 문제 수를 계산합니다.
    for (let i = 0; i < answers.length; i++) {
        if (answers[i] === pattern1[i % pattern1.length]) {
            score[0]++;
        }
        if (answers[i] === pattern2[i % pattern2.length]) {
            score[1]++;
        }
        if (answers[i] === pattern3[i % pattern3.length]) {
            score[2]++;
        }
    }
    
    // 가장 높은 점수를 찾습니다.
    const maxScore = Math.max(...score);
    
    // 가장 높은 점수를 받은 수포자를 배열에 담아 반환합니다.
    const result = [];
    for (let i = 0; i < score.length; i++) {
        if (score[i] === maxScore) {
            result.push(i + 1);
        }
    }
    
    return result;
}

// 입출력 예시 테스트
console.log(solution([1, 2, 3, 4, 5])); // 출력: [1]
console.log(solution([1, 3, 2, 4, 2])); // 출력: [1, 2, 3]

이 코드는 주어진 문제를 올바르게 해결하며, 알고리즘 코딩 테스트의 관점에서도 적절한 풀이입니다.

profile
1인개발자가 되겠다
post-custom-banner

0개의 댓글