Programers코테연습(Java)

[Programmers TIL 2일차] 가채점

코철이 2024. 4. 20. 19:56

1. 문제

class Solution {
    public String[] solution(int[] numbers, int[] our_score, int[] score_list) {
        int num_student = numbers.length;
        String[] answer = new String[num_student];

        for (int i = 0; i < num_student; i++) {
            if (our_score[i] == score_list[i]) {
                answer[i] = "Same";
            }
            else {
                answer[i] = "Different";
            }
        }

        return answer;
    }
}

 

A반 학생들은 시험이 끝난 뒤 성적이 나오기 전 자기 시험지를 가채점해 보았습니다. 이후에 선생님이 실제 성적을 불러 줄 때 가채점한 점수와 실제 성적이 다른 학생들이 있어 선생님께 문의를 하려고 합니다.

성적을 문의하려는 학생들의 번호가 담긴 정수 리스트 numbers와 가채점한 점수가 성적을 문의하려는 학생 순서대로 담긴 정수 리스트 our_score, 실제 성적이 번호 순서대로 담긴 정수 리스트 score_list가 주어집니다. 주어진 solution 함수는 가채점한 점수가 실제 성적과 동일하다면 "Same"을, 다르다면 "Different"를 순서대로 리스트에 담아 return하는 함수입니다. solution 함수가 올바르게 작동하도록 한 줄을 수정해 주세요.

 

 

2. 풀이

int[] numbers  -> 학생 번호(학번)

int[] our_score -> 가채점

int[] score_list -> 실제점수

 

이 문제는 문제 부분에 이미 작성된 코드를 가지고 어떤 부분에 의해 오류가 발생한 것인지 확인하고 수정하는 디버깅 문제이다.

밑에 풀이로 7번째 줄에 score_list[numbers[i]-1]로 수정 후 정상적으로 테스트 통과 메시지가 나타났다.

class Solution {
    public String[] solution(int[] numbers, int[] our_score, int[] score_list) {
        int num_student = numbers.length;
        String[] answer = new String[num_student];

        for (int i = 0; i < num_student; i++) {
            if (our_score[i] == score_list[numbers[i]-1]) {
                answer[i] = "Same";
            }
            else {
                answer[i] = "Different";
            }
        }

        return answer;
    }
}

 

3. 해석

일단 주어지는 학생의 수를 확인 해야하니 주어지는 학생의 번호가 몇개인지 확인을 위해 numbers.length;를 이용해서 num_student에 넣어준다. num_student는 실제 점수와 가채점한 점수가 맞지 않아 선생님께 문의하는 학생의 수 이다.

 

그리고 for문을 이용하는데, 배열 인덱스를 이용하기 위해 0부터 문의하는 학생의 수의 -1을 한 수까지 반복해준다.

 

if(our_score[i] == score_list[i] {

    answer[i] = "same";

이 부분은 만약 가채점 점수와 실제 점수가 같다면 answer 배열에 "same"문자열을 추가 하라는 것이다.

그런데 이렇게 되면 학생번호[1] , 가채점 점수[100], 실제점수[100,80,90,84,20]이 주어질 때는 정상적으로 "Same"이 출력될 것이다.

 

그러나 학생 번호[3,4] , 가채점 점수 [ 85,93] , 실제 점수 [85,92,38,93,48,85,92,56]의 경우에는 

학생 번호가 2개이기 때문에 for문을 통해 0부터 1까지의 인덱스를 반복할 것인데, 

if(our_score[0] == score_list[0] ) 로 보면 가채점 점수[0] => 85 , 실제 점수[0] => 85를 비교해서 "Same"을 출력할 것이다.

또 인덱스 1로 보면 가채점 점수[1] => 93 , 실제 점수[1] => 92로  93==92는 false이기 때문에 else문

    else{

        answer[i] = "Different";
    } 

을 실행시키기 떄문에 "Different"를 출력할 것이다.

 

 

그러나 테스트2의 결과로는 결괏값과 기댓값이 달라서 테스트가 원하는 결과가 나오지 않는다.

이를 한 줄만 고쳐서 만족시켜주는 문제이기 때문에 어떻게 만족 시켜야 하냐면, 

 

주어지는 가채점 점수[85,93]와 실제점수[85,92,38,93,48,85,92,56]를 학생 번호[3,4]에 맞게 조건문을 넣어줘야 한다.

if(our_score[i] == score_list[numbers[i] -1] 로 고쳐주면 모든 테스트 결과가 만족한다.

 

일단 numbers[i]를 먼저 보면, for문을 통해 인덱스를 0과 1이 주어지고 number[0]과 nubmers[1]이 된다.

그러면 numbers[i]의 값은 3과 4가 된다. 그 후 numbers[i] -1을 통해 3과 4에 -1을 해주면 2와 3이 되고,

score_list[2]  ,  score_list[3]이 된다. 이제 결괏값과 기댓값이 같은지 확인 해보자.

 

이제 if(our_score[0] == socre_list[2])는 if(85 == 38)과 같은 것이다 이는 false값으로 반환되며

문제 수정 전에는 3번 학생의 가채점점수와 실제점수가 같다고 "Same"을 출력했으나, 지금은 false값이 반환되기 때문에 else문의 "Different"를 출력할 것이다.

 

4번 학생의 경우는 if(our_score[1] == score_list[3])이 되고 if(93 == 93)과 같기 때문에 true값이 반환되어 if문 안의 "Same"이 출력 될 것이다.

 

 

이제는 기댓값을 충족시켜줬기 때문에 테스트2 번도 테스트 통과의 결과가 나왔다.

아래와 같이 나머지 테스트들도 무난히 통과 된다.