본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 문자열 내 마음대로 정렬하기(C#)

by jyppro 2023. 8. 24.

문자열 내 마음대로 정렬하기

안녕하세요 오늘은 "문자열 내 마음대로 정렬하기" 문제를 풀어보도록 하겠습니다. 이제 정답률은 60% 대로 내려오게 되었습니다.

 

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

 

제한 조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

 

입출력 예

strings n return
["sun", "bed", "car"] 1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]

 

입출력 예 설명

입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.

입출력 예 2
"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.

 

시작 코드

public class Solution {
    public string[] solution(string[] strings, int n) {
        string[] answer = new string[] {};
        return answer;
    }
}

 

나의 풀이

using System.Linq;

public class Solution {
    public string[] solution(string[] strings, int n) {
        string[] answer = new string[] {};
        
        answer = strings.OrderBy(x => x).OrderBy(x => x[n]).ToArray();
        return answer;
    }
}

 

코드 분석

string타입의 배열 strings와 int형 n이 주어지며 코드가 시작됩니다. 코드가 단 한줄만 적혀있습니다.

배열 strings를 OrderBy()를 통해 정렬하고, 한번 더 OrderBy()를 사용하여 x[n]을 기준으로 정렬합니다. 그리고 정렬된 내용을 ToArray()로 다시 배열로 바꿔줍니다. 해당값을 answer에 넣고 리턴해줍니다.

 

풀이 설명

이번 문제의 풀이는 using.System.Linq를 이용해 sql문에서 사용되는 OrderBy()를 연속적으로 이용해서 정렬하는 방식입니다. 방식은 간단합니다. 기본적으로 OrderBy()는 오름차순 정렬을 하므로, 첫 정렬에서는 기본적인 오름차순 정렬이 됩니다. 이후 두번째 정렬에서 x -> x[n]을 통해 x[n]을 기준으로 오름차순 정렬됩니다.

 

이번 풀이 방식에는 약간의 문제가 있습니다. 프로그래머스 제출결과 실행속도가 현저히 느리다는 것입니다.

느린-실행속도
Linq를 이용한 짧은 코드의 실행속도

 

다른 풀이

using System;

public class Solution
{
    public string[] solution(string[] strings, int n)
    {
        Array.Sort(strings, (a, b) =>
        {
            int c = a[n].CompareTo(b[n]);
            if (c == 0) { return a.CompareTo(b); }
            return c;
        });
        return strings;
    }
}

느린 실행속도를 보완하기 위해 다른 코드를 찾아봤습니다. 이번에는 Linq를 사용하지 않고, using.System과 Array.Sort(), CompareTo()를 사용하는 방식입니다. 이 코드를 실행시킨 결과

빨라진-실행속도
Linq를 사용하지 않는 긴 코드의 실행속도

거의 절반가량으로 속도가 빨라진 것을 볼 수 있습니다.

 

<NEXT>

오늘은 "문자열 내 마음대로 정렬하기" 문제를 풀어보았습니다. 문제의 요구사항 자체는 크게 어려울 것이 없었지만, 푸는 방식과 사용하는 코드에 따라 코드의 길이, 실행속도가 차이가 나는 것을 확인할 수 있었습니다. 앞으로 2단계 문제부터는 실행속도나 효율성에 따른 제한도 생겨나기 때문에 짧은 코드도 좋지만, 성능도 신경을 쓸 필요가 있어 보입니다.

다음에는 정렬 카테고리에 포함되어 있는 "K번째 수" 문제를 다뤄보도록 하겠습니다. 감사합니다.