개발자 블로그

프로그래머스 - 문자열 내 마음대로 정렬하기 본문

알고리즘/프로그래머스

프로그래머스 - 문자열 내 마음대로 정렬하기

hayongwoon 2022. 4. 26. 12:03

문제 설명

더보기

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

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

제한 조건
  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예stringsnreturn
["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"] 입니다.

 

나의 풀이

def solution(strings, n):
    strings.sort()
    strings.sort(key=lambda x: x[n])

    return strings

1) 해당 인덱스(n)이 같은 값이 존재할 수 있기 때문에, 제한사항에 맞게 우선 전체를 사전순으로 정렬을 먼저 해준다.

 

2) 조건에 맞는 인덱스를 기준으로 다시 정렬을 해준다.

 

**사실 이 문제는 알고리즘이 어렵다기 보다. sort 함수에 대한 이해가 필요했다. 따라서 sort 함수에 대해 오늘 배운 것을 정리하는 식으로 작성해보겠다.

 

참고: https://docs.python.org/ko/3/howto/sorting.html

 

정렬 HOW TO — Python 3.10.4 문서

정렬 HOW TO 저자 Andrew Dalke와 Raymond Hettinger 배포 0.1 파이썬 리스트에는 리스트를 제자리에서(in-place) 수정하는 내장 list.sort() 메서드가 있습니다. 또한, 이터러블로부터 새로운 정렬된 리스트를 만

docs.python.org

1) 키 함수

list.sort() sorted()는 모두 비교하기 전에 각 리스트 요소에 대해 호출할 함수(또는 다른 콜러블)를 지정하는 key 매개 변수를 가지고 있습니다.

키 함수를 통해 기준을 정해 정렬을 할 수 있다. lambd 표현식을 활용할 수도 있고 operator 모듈을 사용하여 다중 수준의 정렬도 가능하다. 자세한 내용은 위 공식 문서를 통해 확인해보자!

 

2) 내림차순

list.sort() sorted()는 모두 불리언 값을 갖는 reverse 매개 변수를 받아들입니다. 내림차순 정렬을 지정하는 데 사용됩니다.

기본적으로 오름차순으로 정렬을 하지만, reverse=True를 선언해주면 내림차순으로 정렬이 된다.

 

3) list.sort(), sorted()의 차이

3-1) sort()함수는 리스트 객체만을 메소드로 활용, sorted는 모든 이터러블을 받아들인다.

3-2) list.sort()는 None값을 반환한다. 참조하는 객체 그대로를 수정하기 때문이다. 반면, sorted()는 새로운 메모리에 형변환된 데이터를 저장시켜준다. 따라서 참조를 통해 새로운 리스트 객체를 변수에 할당하여 사용한다.

 

*아 참고로 sort의 시간 복잡도는 O(n*logn)이다.