티스토리 뷰

문제 : 모의고사 - 프로그래머스

풀이과정

풀이를 진행하기 위해 먼저 Student 클래스를 만든다.

  • 각 Student 클래스의 인스턴스(수포자)는 자신이 찍는 방법을 가지고 있다.
  • 시험 문제의 정답지가 주어지면 자신이 찍는 방법과 비교하여 채점을 진행할 수 있다.
  • 최종 점수를 가지고 있다.

이후 진행 과정은 아래와 같다.

  1. 주어진 수포자 정보에 따라 Student 클래스의 인스턴스들을 생성한다.
  2. 1에서 만들어진 인스턴스들(수포자들)에게 채점을 진행시킨다.
  3. 최고점수를 확인한다.
  4. 최고점수와 동일한 점수를 가진 학생들을 찾아 반환한다.

풀이 자체는 간단하게 진행할 수 있지만, Student 클래스를 생성하면서 어디까지가 Student 클래스 내로 들어가야 하는 역할이고, 어디부터가 그렇지 않은지를 생각하는 것이 은근히 까다로웠던 것 같다.
단순히 효율성 좋게 푸는 것 보다 Java라는 언어가 객체 지향 언어인 만큼 어떻게 하면 더 객체지향적으로 풀 수 있을지도 꼭 한번씩 다시 생각해 봐야겠다.

소스코드

import java.util.ArrayList;

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

        // 각 학생별 채점
        Student[] students = {student1, student2, student3};
        for (Student student : students) {
            student.marking(answers);
        }

        // 최고점수 확인
        int highestScore = findHighestScore(students);

        // 최고 점수를 받은 학생 탐색
        ArrayList<Integer> topStudentsId = new ArrayList<>();
        for (Student student : students) {
            if (highestScore == student.getScore()) {
                topStudentsId.add(student.getId());
            }
        }

        return topStudentsId.stream().mapToInt(i -> i).toArray();
    }

    private int findHighestScore(Student[] students) {
        int highestScore = 0;
        for (Student student : students) {
            int score = student.getScore();
            if (score > highestScore) {
                highestScore = score;
            }
        }
        return highestScore;
    }
}

class Student {
    private final int[] answerSheet;
    private final int id;
    private int score;

    Student(int[] answerSheet, int id) {
        this.answerSheet = answerSheet;
        this.id = id;
    }

    private boolean checkOneAnswer(int answer, int idx) {
        return (this.answerSheet[idx % this.answerSheet.length] == answer);
    }

    public void marking(int[] ref) {
        int currentScore = 0;
        for (int i = 0; i < ref.length; i++) {
            if (this.checkOneAnswer(ref[i], i)) {
                currentScore++;
            }
        }
        this.score = currentScore;
    }

    public int getScore() {
        return this.score;
    }

    public int getId() {
        return this.id;
    }

}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함