<Algorithm2.> 문자열 내 마음대로 정렬하기

Sinjae Lee·2021년 6월 18일
0

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

문제 설명
문자열로 구성된 리스트 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"]

오답

def solution(strings, n):
    my_dict = {}
    answer = []

    for i in strings:
        my_dict[i[n:]] = i
        s_dict = sorted(my_dict.items())    
    	
        #  dict sorted 돌리면 tuple로 뱉는다
        
    for s in s_dict:
        answer.append(s[1])
        
        # 예를 들어 {"a":1, "b":2 ..}에서 sorted 시키면
        # [("a",1), ("b",2)] 이런식으로 말이다 그래서 append(s[1])해줬다
        
    return answer

25.0 ㅠㅠ
리스트 정렬에서 특정 인자값으로 리스트 정렬을 하는 방법을 찾고 싶었는데 못찾았다.
그래서 시도해본 것이 해당 n 위치의 str 을 추출해서 dict key값으로 보내고 원래의 str 을 value 값으로 하는 dict 로 치환해서 정렬 후 다시 list 로 돌리기 너무 불필요한 작업들도 많고 비 효율적이라 하면서도 맘에 안들었는데 테스트 통과도 안된다 ㅋㅋ

사실 통과 안되는 테스트들의 입력값을 확인해보고 싶은데 안되는것 같다.

다른사람 풀이

def strange_sort(strings, n):
    '''strings의 문자열들을 n번째 글자를 기준으로 정렬해서 return하세요'''
    return sorted(strings, key=lambda x: x[n])

오 역시 lambda 한줄로 끝낸다. 어제 집에 가는길에 lambda 이야기를 했는데
lambda 공부해야겠다.

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

위의 답안과 비슷해보인다. 익명함수 lambda 대신 sortkey 함수를 선언해줘서 str 의 n을 뽑아내고 해당 글자 기준으로 정렬한거 같다 오 이게 되네?

my_list = ["dog", "cat", "bed"]
for i in my_list:
    my_list.sort(i[1])

print(my_list)

이렇게도 쓸 수 있는건가 하고 바로 돌려봤는데 안된다
TypeError: sort() takes no positional arguments
라고 한다. 특정 값을 부여해주는건 안되는거 같아서 확인해봤더니

key fuction 이 주어졌을때 apply it once to each list item and sort them, according to their fucntion values
그 key function 을 각 list item 에 적용해서 sort them 한다고 한다.

그래서 위에 답 쓰신분이 key = sortkey 라는 fuction으로 하셨구나 깨닫고 갑니다.

공부해야할 것
앞으로 평소에 자주 쓰던 기본 메소드 들도 설명 꼼꼼히 봐봐야겠다. 그리고 lambda 쓰는법 공부하기

profile
Back-end developer

0개의 댓글