[BOJ 1181][백준 1181번] 단어 정렬 (파이썬 풀이)

도깨비젤리

·

2021. 6. 2. 01:30

https://www.acmicpc.net/problem/1181

 

🤔 문제 설명 및 입출력


 

 

 접근 방법


앞서 풀었던 10814번과 완전 동일한 유형의 문제이다.

 

참고 : https://spookyjelly.tistory.com/15

 

 

1순위 : len(x) / 2순위 : x 로 두고 sort with lambda를 사용하여 정렬 후, 출력한다.

 

👨‍💻 소스 코드


  • 파이썬
N = int(input())

words = []
for _ in range(N):
    words.append(input())


words = list(set(words))

# 길이 순 정렬 / 2순위 : 사전 순 정렬
words = sorted(words,key= lambda x : [len(x),x]) 


for word in words:
    print(word)

문자열 타입도 sort를 통해 정렬 시킬 수 있다. 그리고 그렇게 정렬시키면 파이썬이 자동으로 사전 순으로 정렬해준다.

놀라움! 😍😍😍 

 

🔥 강평


이거 자바스크립트로 구현하라고 했으면 굉장히 머리 아팠을 것 같다...

파이썬 그는 신인가?

 

 

 

아직 lambda를 이용한 정렬이 익숙치 않은 분들을 위해 제가 공부할때 정리 해놓은 노트를 별첨합니다.

 

 

sort with Lambda


정확히 말하자면, .sort / sorted()는 정렬 조건으로 key를 받는다.

근데 그 key라는 것이 함수형을 받을 수 있기에, 즉석 함수인 Lambda도 받을 수 있는 것이다.

일반적인 소팅은 알다시피 아래와 같다.

 

a = [4,1,2,5,7,3,6] 
b = sorted(a) 
# b = [1,2,3,4,5,6,7]

 

아무런 key도 넣어주지 않은 경우, 순수한 오름차순 정렬이 된다.

하지만, key를 넣어주게 되면 정렬을 다양하게 활용할 수 있다.

lambda는 lambda 매개변수 : 표현식 꼴로 사용되는데, 매개변수의 자리에 lamda가 사용된 자료형의 값들이 들어가게 된다.

 

a = [(1, 2), (0, 1), (5, 1), (5, 2), (3, 0)] 

# 인자없이 그냥 sorted()만 쓰면, 리스트 아이템의 각 요소 순서대로 정렬을 한다. 

b = sorted(a)
# b = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)] 



# key 인자에 함수를 넘겨주면 해당 함수의 반환값을 비교하여 순서대로 정렬한다. 
# 이하는 x[0] 과 x[1]을 기준으로 오름차순 정렬한 모습이다. 

c = sorted(a, key = lambda x : x[0])
# c = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)] 

d = sorted(a, key = lambda x : x[1]) 
# d = [(3, 0), (0, 1), (5, 1), (1, 2), (5, 2)] 


# 아이템 첫 번째 인자를 기준으로 오름차순으로 먼저 정렬하고, 
# 그리고 그 안에서 다음 두 번째 인자를 기준으로 내림차순으로 정렬하게 하려면, 다음과 같이 할 수 있다. 

e = [(1, 3), (0, 3), (1, 4), (1, 5), (0, 1), (2, 4)] 

f = sorted(e, key = lambda x : (x[0], -x[1])) 
# f = [(0, 3), (0, 1), (1, 5), (1, 4), (1, 3), (2, 4)]

정리하면,

  • sorted()의 key 인자로, 내가 커스텀할 비교 함수를 보내주면 넣어주면 된다.
  • 비교 함수는 비교할 아이템의 요소를 반환하면 된다.
  • 비교 함수는 익명 함수(lambda) 도 가능하고, 별도로 정의해도 된다.
  • 비교할 아이템의 요소가 복수 개일 경우,
    • ex. sorted(e, key = lambda x : (x[0], -x[1]))
    • - 를 붙이면, 현재 정렬차순과 반대로 하게 된다. ( 오름차순 ➡ 내림차순)
  • 튜플로 그 순서를 내보내주면 된다.

 


한편, 다음을 살펴보자

log = ["dig1 8 1 4 5", "dig3 1 3 4 5", "dig2 2 203 1 0"]

dign을 식별자라고 할 때, 이 하의 숫자들을 기준으로 오름차순 정렬해보자.

log = sorted(log,key = lambda x : x.split()[1:])

x.split()[1:]이 제일 눈에 띄는데, 위에서 말했듯, x 인자 자리에는 lambda가 사용되는 자료형의 인자들이 들어가고, .sort / sorted 함수는 해당 key를 기준으로 정렬을 시행한다고 하였다.

 

따라서 log의 요소들을 공백 단위로 나눈 후, 그것의 1번째 요소부터 기준으로 하여 오름차순 정렬을 한다는 말이다.

표현이 조금 덜 다듬어 졌는데, 반복해서 사용하다보면 곧 익숙해질것이다.

  • 만약 정렬 기준이 한가지 이상이라면?
  • 아래와 같이 튜플 꼴로 묶어줘야한다!! (리스트 꼴로 묶어도 됩니다.)
  • 에러 뜰 때는 위치 인자랑 키워드 인자 문제라고 말이 나오는데, 복수의 기준이 필요하다면 튜플로 묶어야한다고 알고 있자.( 다시 한번 말하지만, 리스트 꼴로 묶어도 됩니다)
letter.sort(key=lambda x: (x.split()[1:], x.split()[0]))

등장 순서 대로 우선순위가 적용된다.

여하튼, Lambda는 sort, filter와 쓸때 가장 파워풀 해지니까, 익숙하게 사용하도록 하자.