알고리즘

프로그래머스 JS | 인사고과

3jun 2023. 1. 20. 21:50

❌ Solution (48 / 100 )

프로그래머스에서는 백준과 달리 이전에 제출했던 코드를 확인할 수 없어, 생각했던 로직만 서술하고 넘어가기로 했다.

 

1. 재귀함수를 사용하여 각 사원별로 모든 사원들과 비교하여 근무 태도 점수와 동료 평가 점수의 총합을 비교하여 임의의 사원보다 두 점수가 모두 낮은 경우, 즉 인센티브 대상자가 아닌 사원들을 제외하고 인센티브 대상자인 사원들로만 이루어진 배열을 새로 만들었다.
2. 이때 완호가 인센티브 대상자가 아닐 경우에 한하여 -1을 return 하고,
3. 그렇지 않은 경우 인센티브 대상자 배열을 반복문을 사용하여 index 값이 1인 인자부터 index 값이 0인, 가장 첫 번째에 위치하는 인자와 두 점수의 합을 비교하여 index 0의 인자보다 합이 큰 경우 answer 값에 1을 추가하여 등수를 구했다.

( index 값이 0인 가장 첫번째 오는 인자를 기준으로 반복문을 사용한 이유는 1번의 재귀함수에서 완호가 인센티브 대상자라면 해당 배열에서 첫번째에 위치하기 때문)

 

이 경우, 정확도 48점 으로 오답처리가 된다.

17번째 테스트케이스부터 시간초과 에러가 출력되었다.

재귀함수를 사용하는데 문제가 있다고 판단했고, 이를 개선하기 위해

재귀함수를 사용하기전, 가장 첫번째 index에 위치하는 완호를 먼저 제외하고 재귀함수를 실행하도록 해보았다.

하지만 이 역시 같은 점수로 오답

 

아마 scores의 길이가 100,000 개 까지이므로 한가지 케이스만 제외한다고 해서 크게 전체적인 코드 실행에 영향이 없는 듯 했다.

게다가 오히려 완호를 포함하여 재귀함수를 실행하고 완호가 인센티브 대상자가 아닌경우 -1 을 바로 return 하고 코드를 멈추는게 시간복잡도가 더 낮을 것으로 생각되어 올바르지 않은 접근이라고 생각되었다.

 

2시간 정도 고민했지만, 스스로 답을 찾지 못했고 프로그래머스의 장홍범이라는 분의 자바 코드 답안을 보고 아래 정답 코드를 작성할 수 있었다. 

✅ Solution( 100 / 100 )

function solution(scores) {
    const wanho = scores[0];
    // 근무태도점수 내림차순정렬, 근무태도 동점일 경우 동료평가점수 오름차순 정렬
    scores.sort((a,b) => a[0] === b[0] ? a[1] - b[1] : b[0] - a[0]);
    let answer = 1;
    let maxScore = 0;
    const wanhoSum = wanho[0] + wanho[1];
    
    for(let score of scores){
        // 내 앞의 동료평가점수가 나보다 높은 사람이 한 사람이라도 있으면 탈락
        // 근무태도 동점자의 경우 동료평가점수 오름차순 정렬 되어있으므로 고려할 필요X
        if(score[1] < maxScore) {
            // 탈락대상
            if(score === wanho) return -1;
        } else {
            // 인센대상
            maxScore = Math.max(maxScore, score[1]);
            if(score[0] + score[1] > wanhoSum){
                answer++;
            }
        }
    }
    return answer;
}

근무 태도 점수 내림차순 정렬, 동료 평가점수를 오름차순으로 정렬하고 나면

반복문을 사용하여 값을 비교할 때 앞선 index 값의 인자들은 무조건 근무 태도 점수가 높기 때문에 동료 평가 점수만 비교하여 탈락대상과 인센대상을 판단할 수 있게 된다. 

( 앞에 위치하는 사원들은 이미 근무 태도 점수가 높기 때문에 동료 평가 점수가 높은 사원의 경우의 수가 한 개라도 있으면 탈락대상이기 때문이다. )

완호가 탈락대상이라면 바로 -1을 출력하고 그렇지 않다면 answer 변수에 1씩 값을 더하고 반복문이 끝나면 answer를 return 하도록 하였다. 

 

굉장히 간단한 풀이 방식임에도 maxScore가 코드에서 가지는 의미를 파악하지 못해 이해하는데도 꽤나 어려움이 있었다.

 

참고

- https://school.programmers.co.kr/questions/42820