[코딩테스트]프로그래머스 : 문자열 내 마음대로 정렬하기

김은지·2022년 6월 6일
0

코딩테스트

목록 보기
8/17
post-thumbnail

문제 : 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬

문제를 처음에 보고, string[i][n]을 키로 갖는 딕셔너리를 만들어 해결하면 되지 않을까 생각해서
코드를 작성하고 테스트를 돌렸더니, 원소로 주어진 문자열 하나가 사라졌다.
이유를 생각하던 중에

제약조건 중
1.인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 2.사전순으로 앞선 문자열이 앞쪽에 위치합니다.
이 있다는 것을 발견했다.

딕셔너리의 키값은 중복될 수 없으므로 정렬할 문자를 키값으로 딕셔너리를 작성하던 코드는 지우고,
아래와 같은 답을 작성하였다.

def solution(strings, n):
    strings.sort() # 1
    
    ch_list = [i[n] for i in strings]
    ch_dict = {}
    
    for i in range(len(strings)):
        ch_dict[i] = ch_list[i]
    
    return [strings[i[0]] for i in sorted(ch_dict.items(), key=lambda x: x[1])] #2

오늘 문제를 풀면서 명확히 알게 된 점은
1. sort()와 sorted()의 차이점/공통점

<차이점>

  • sort()는 list의 빌트인 함수이다.(list에만 사용 가능)
  • sort()는 원본을 변화시키고 None을 리턴한다.
  • sorted()는 원본을 변화시키지 않고, 정렬한 데이터를 리턴한다.

<공통점>

  • 둘 다, reverse, key 매개변수를 지정할 수 있다.
  • key는 각 리스트 요소에 대해 호출할 함수(또는 다른 콜러블)을 지정하는 매개 변수 이다.
  • 지정된 key에서 리턴된 값을 기준으로 정렬한다.

같은 기능을 더 쉽고 빠르게 만드는 기능을 제공하는 operator 모듈
operator 모듈에는 1. itemgetter(), 2. attrgetter() 및 3. methodcaller()가 있다.

#1. itemgetter()
from operator import itemgetter
students = [
    ("jane", 22, 'A'),
    ("dave", 32, 'B'),
    ("sally", 17, 'B'),
]
result = sorted(students, key=itemgetter(1))
print(result) # [('sally', 17, 'B'), ('jane', 22, 'A'), ('dave', 32, 'B')]
students = [
    {"name": "jane", "age": 22, "grade": 'A'},
    {"name": "dave", "age": 32, "grade": 'B'},
    {"name": "sally", "age": 17, "grade": 'B'},
]
result = sorted(students, key=itemgetter('age'))
print(result) # [{'name': 'sally', 'age': 17, 'grade': 'B'}, {'name': 'jane', 'age': 22, 'grade': 'A'}, {'name': 'dave', 'age': 32, 'grade': 'B'}]
# 2. attrgetter : 리스트요소가 클래스 요소라면 attgetter을 사용해야 한다. 
from operator import attrgetter
class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade
students = [
    Student('jane', 22, 'A'),
    Student('dave', 32, 'B'),
    Student('sally', 17, 'B'),
]
result = sorted(students, key=attrgetter('age'))
# 3. methodcaller()는 인자로 함수와 인자를 받는데, name 함수를, 뒤의 인자를 넣어서 반환한다.
operator.methodcaller(name, /, *args, **kwarg) #는 아래와 같다.
def methodcaller(name, /, *args, **kwargs):
    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller
  1. 람다식
    람다식은 처음 써보는데, 이름 없는 함수를 만들어 쓴다고 생각하면 될 것 같다.
    람다식의 구조는 아래와 같다.
lambda 매개변수 : 리턴값 

매개변수가 여러개일 수 도 있고, default 값을 정해줄 수도 있지만, 자료형은 제한할 수 없다고 한다.

가끔 다른 사람들 코드 보다가 람다식이 있으면 앗... 어려운 코드 하면서
갑자기 어지러웠는데, 이제 자신있다! 자신있어~!

앗 슨배림들 코드

def strange_sort(strings, n):
    return sorted(sorted(strings), key=lambda x: x[n])
#코드를 보고 든 생각 나는 뭘 한거지? 왜 이런저런 코드를 썼을까??? sorted가 뭘로 리턴되는지를 몰랐는가봉가... list로 리턴된다.


def strange_sort(strings, n):
    def sortkey(x):
        return x[n]
    strings.sort(key=sortkey)
    return strings

#sortkey를 람다로 안 쓰니 오히려 낯설다. 

문제 풀기 시작한지도 며칠 안 되고
지금 이런말 하는건 웃기긴 한데.. 정말 재미있다.
게임하는 것 같다.

그리고 하나를 제대로 파라는 말이 뭔지 머리카락만큼 알 것 같다.
나 파이썬 잘 모르는구나 ^-^...

나아가자~! 가보자고옷~!

참고 :
python 공식문서
프로그래머스-문자열 내 마음대로 정렬하기

0개의 댓글