본문 바로가기

찌끄레기 개발자/프로그래머스

[Java] 프로그래머스 위클리 챌린지 2주차

프로그래머스 위클리 챌린지 2주차에는 이런 문제가 나왔습니다.

이 문제 또한 난이도가 낮은 편이기 때문에 여러 가지 풀이가 나올 수 있는데

다른 사람들의 풀이를 봤을 때 '오, 이거 좋은데?' 싶은 방법을 보지 못했기 때문에

제가 풀었던 방식으로 소개해볼까 합니다.


 

1. 자기 자신에게 준 점수가 유일한 최저점 혹은 유일한 최고점인지 구하기

0번 학생이 받은 점수는 scores[0]이며, 자기 자신에게 준 점수는 scores[0][0]입니다

저는 유일한 최고점 혹은 유일한 최저점이라고 한다면

본인이 받은 모든 점수가 자기 자신에게 준 점수보다 낮거나

본인이 받은 모든 점수가 자기 자신에게 준 점수보다 높아야 한다고 생각했습니다.

그래서 int 타입의 flag라는 변수를 0으로 선언하여

scores[0][0], scores[0][1], ···, scores[0][N] 까지 돌면서

자기 자신에게 준 점수보다 높으면 flag++, 자기 자신에게 준 점수보다 낮으면 flag--를 했고

scores[0][N]까지 돌고 난 후에 flag의 절대값(높은지 혹은 낮은지의 갯수를 세기 위한 변수)과

scores.length - 1(본인을 제외한 사람들의 수)을 비교하여

같다면 본인이 받은 점수에서 자기 자신에게 준 점수를 제외하고

다르다면 제외하지 않고 평균을 구했습니다.

 

int totalLen = scores.length;
for(int idx1 = 0; idx1 < totalLen; idx1++) {
    int total = 0;
    int flag = 0;
    int my = scores[idx1][idx1];
    int len = totalLen;

    for(int idx2 = 0; idx2 < totalLen; idx2++) {
        int num = scores[idx2][idx1];    // 본인 포함 각 사람들이 본인에게 준 점수
        total += num;

        if(my < num) {    // 자기 자신에게 준 점수와 비교
            flag++;
        } else if(my > num) {
            flag--;
        }
    }

    if(Math.abs(flag) == (len - 1)) {    // 자기 자신에게 준 점수는 위 if문에서 걸리지 않으니 len - 1과 비교
        total -= my;    // 자기 자신에게 준 점수보다 모두 낮거나 모두 높다면 본인의 점수 제외
        len--;
    }

    answer += returnGrade((total / len));
}

 

 

이 문제는 자기 자신에게 준 점수가 유일한 최고점 혹은 유일한 최저점인지를

어떻게 구할 건지가 가장 중요한 것 같습니다

반응형