공돌이 공룡의 서재

[프로그래머스 Level 1] 문자열 내 마음대로 정렬하기 / 연습문제 / 파이썬 본문

코딩/프로그래머스

[프로그래머스 Level 1] 문자열 내 마음대로 정렬하기 / 연습문제 / 파이썬

구름위의공룡 2020. 8. 16. 13:46

 

<문제>

 

<풀이> ※ lambda 사용 X

def solution(strings, n):
    # Dictionary 이용
    answer = []
    box = {}
    
    #1 
    for i in range(len(strings)):
        box[strings[i][n]] = []
    #2    
    for i in range(len(strings)):
        box[strings[i][n]].append(strings[i])
        box[strings[i][n]] = sorted(box[strings[i][n]])
    #3
    criterion = sorted(list(box.keys()))
    for i in range(len(criterion)):
        for j in range(len(box[criterion[i]])):
            answer.append(box[criterion[i]][j])

    return answer

 

코드 설명:

dictionary를 이용했는데 5번째 문제조건때문에 코드가 좀 길어졌다. 우선 처음 2줄에서 answer 배열과 dictionary에 해당하는 변수(box)를 선언.

 

#1 -> dictionary에 key값들을 다 넣어줬는데 맨 처음에는 value 값을 빈 배열로 선언해주었다.

 

#2 ->  #1 과정에서 value를 빈 배열로 선언했기 때문에 다른 문자에서 중복되는 key값이 있을 경우 사전순으로 정렬되게끔 할 수 있다. 

 

#3 -> key값들을 정렬하고 차례차례 key값에 있는 value값들을 꺼내어 answer에 append시켜준다. 여기서 #2 과정때문에 다시 정렬할 필요가 없다. 

 

+@:

더 짧고 간단하게 코드를 짤 수 있을까 하고 다른 사람들의 풀이를 찾아보니 내장함수 sorted의 key= 와 lambda를 이용한 풀이가 있었다.

def solution(strings, n):
    return sorted(strings,key = lambda a:[a[n],a])
	

(1) sorted는 파이썬 내장함수고 기본적인 Big-O는 NlogN이므로 배열의 길이가 클 땐 정렬 알고리즘을 따로 작성하는게 좋다. 인수로는 정렬할 배열(type은 list), key(정렬할 기준), reversed(오름차순, 내림차순 결정. 따로 설정하지 않으면 False로 작은 값이 먼저 오는 오름차순이나 True로 선언해주면 큰 값이 먼저 오는 내림차순으로 바뀐다.)

 

(2) key값이 lambda 형태로 작성되어 있다. lambda (사용할 변수):(연산) 형태로 작성하는데 [a[n], a] 의 의미는 strings 안의 원소의 n번째 값을 기준을 우선으로 정렬하고, 이후에는 나머지를 보고 판단하여 정렬한다는 의미이다. lambda에 대해서는 좀 더 공부를 해봐야겠다. 

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

 

Comments