문제
https://school.programmers.co.kr/learn/courses/30/lessons/12915
풀이
풀이 1 - (실패)
- for문을 통해 딕셔너리를 생성한다. 키는 원래 주어진 단어 값은 n인덱스부터 자른값을 넣는다.
- 딕셔너리의 값을 기준으로 딕셔너리를 정렬한다.
- 딕셔너리의 키값만을 반환한다.
def solution(strings, n):
my_dict = {i: i[n:] for i in strings}
sorted_dict = sorted(my_dict.items(), key=lambda x: x[1])
return [key for key, value in sorted_dict]
풀이 2 - (성공)
위의 코드를 시도했을때 정확도가 30점으로 실패했다. 그 이유는 my_dict 딕셔너리 생성 시 중복되는 n-번째 글자를 가진 문자열들이 사라진다는 점 떄문이다.더 자세히 말하면 작동방식은 아래와 같다.
- my_dict 딕셔너리를 생성한다. 이때, 각 문자열의 n-번째 글자를 키로, 해당 글자부터 끝까지의 부분 문자열을 값으로 지정한다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 my_dict는 {'s': 'un', 'b': 'ed', 'c': 'ar'} 가 된다.
- sorted_dict는 my_dict의 항목을 값으로 정렬한다. 여기서 문제가 발생한다. my_dict에서 키가 중복되는 경우, 딕셔너리의 특성으로 인해 마지막으로 나타난 키 값만 남게 된다. 즉, 같은 n-번째 글자를 가진 두 문자열 중에서 하나만 남게 된다. 이렇게 되면 원하는 결과를 얻을 수 없다.
따라서 딕셔너리를 사용하지 않고 sorted 함수를 직접 strings 리스트에 적용해야한다.
def solution(strings, n):
sorted_strings = sorted(strings, key=lambda x: (x[n], x))
return sorted_strings
Tip!
- lambda x: (x[n], x) 부분은 람다 함수를 사용하여 두 가지 값을 반환하는 것을 나타낸다. 람다 함수에서 x는 리스트 strings의 각 원소를 의미한다.
- 첫 번째 반환 값인 x[n]은 각 문자열에서 인덱스 n에 해당하는 문자를 의미한다. 이렇게 설정함으로써, sorted 함수는 각 문자열의 n-번째 글자를 기준으로 정렬하게 된다.
- 두 번째 반환 값인 x는 정렬 기준으로 첫 번째 값인 x[n]이 동일한 경우, 즉 n-번째 글자가 같은 문자열들끼리는 원래의 순서를 유지하도록 하기 위한 것이다. 즉, 사전순으로 앞서는 문자열을 먼저 배치하도록 한다.
reference