[프로그래머스 코딩테스트 연습문제] 달리기 경주 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2024년 1월 5일
0

코딩테스트연습

목록 보기
71/106
post-thumbnail

1. 문제 설명

2. 제한사항

3. 입출력 예

4. 입출력 예 설명

5. 첫번째 문제 풀이(2024-01-02)

이번 문제는 callings의 배열의 값들을 꺼내어 해당 열의 선수와 그 앞에 있는 선수를 스위칭 하면 되는 간단한 문제인 줄 알았는데, 음... 뭐랄까 indexOf 메서드 자체가 배열을 순회하는 메서드이다보니 for문이 하나더라도 그 안에 또 다른 이중 for문(indexOf)가 있는 셈이라 n^2의 효율로는 풀지 못하더라고요.

sort 메서드는 리턴 값이 양수일 경우 a와 b를 자리바꾸고, 음수일 경우 그대로 나둡니다. 그래서 보통은 오름차순으로 a-b(양수라는건 a가 크다는 의미이므로 a를 오른쪽으로 이동시켜 오름차순 효과)를 작성하고, 내림차순으로 b-a(양수라는건 b가 크다는 의미이므로 b를 왼쪽으로 이동시켜 내림차순 효과)를 작성하는데요.

물론 0일 경우에도 자리 바뀜이 일어나지는 않지만, 이 경우에는 문제 그대로 해당 문자열들의 n의 위치에 있는 문자들을 비교해서 a가 더 큰 경우 자리를 바꿔주고, b가 더 클 경우 자리를 바꾸지 않습니다.

그러나 문자가 같을 경우 문제대로 사전순으로 앞선 문자열이 앞으로(왼쪽 순으로) 나와야 하기 때문에 해당 같을 경우 문자가 아니라 문자열을 비교하여 마찬가지로 a가 더 클때에는 자리바꿈 x, b가 크면 자리바꿈 o, 그마저도 같으면 0을 리턴해 줌으로서 해당 문제를 풀었습니다.

그리고 sort 메서드를 사용할 때 a-b, b-a이런 식 보다 if else문을 사용해서 가독성을 향상시키는 편이 더 나을지도 모르겠다는 생각이 들기도 했던 것 같습니다.

function solution(strings, n) {
   
    strings.sort((a,b) => {
        if(a[n] < b[n]) return -1; // 문자 끼리 비교
        else if(a[n] > b[n]) return 1;
        else{ // 문자가 같을 경우
            if(a<b) return -1; // 문자열끼리 비교
            else if(a>b) return 1;
            return 0;
        }
    });
    return strings
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글