[백준] 1181 단어정렬

klean·2021년 5월 25일
0
post-thumbnail

문제 설명

단어의 배열이 주어집니다.
배열을 1. 단어의 길이에 따라 2. 단어의 길이가 같다면 알파벳 순서대로 정렬하세요.
단, 중복제거 해서 출력하세요

아이디어

set으로 인풋을 받아 중복을 제거 한 후
1.길이 기준, 2. 알파벳 순서 기준으로 정렬을 한다.

소스코드

v1. sort 2번 호출

sort가 stable 하다는 점을 이용해서 낮은 우선순위로 먼저 sort 후 높은 우선순위로 sort

n = int(input())
s = set()
for i in range(n):
    s.add(input())
l = list(s)
l.sort()
l.sort(key = lambda x : len(x))
for i in range(len(l)):
    print(l[i])

v2. sort 1번 호출

v1 처럼 할 필요 없이 key를 여러개 전달할 수 있다.

n = int(input())
s = set()
for i in range(n):
    s.add(input())
l = list(s)
l.sort(key=lambda x : (len(x),x))
for i in range(len(l)):
    print(l[i])

custom sort in python

키를 활용

lambda x는 해당 iterable의 하나의 원소를 나타낸다.
만약 작은 list가 원소였다면

# 1번째 우선순위로 첫 번째 인자를 기준으로 오름차순, 2번째 우선순위로 두 번째 인자를 기준으로 내림차순으로 정렬
f = sorted(e, key = lambda x : (x[0], -x[1]))

custom class를 쓰는 일도 있겠지만 알고리즘 문제에서 일반적으로 custom class를 구현하는 것보단 list나 튜플이 다양한 자료형을 섞어 가질 수 있다는 것을 이용하는 사례가 많다.

# 알고리즘 문제 풀이 시 권장
student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
sorted(student_tuples, key=lambda student: student[2])   # sort by age

# class 구현이 필요할 경우 권장
class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age
    def __repr__(self):
        return repr((self.name, self.grade, self.age))
        
student_objects = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]
sorted(student_objects, key=lambda student: student.age)   # sort by age

역순 정렬

3번째 인자인 reverse = True를 활용한다.

응용

만약 문제에서 2번째 우선순위가 알파벳 역순이었다면

# V1
l.sort(reverse = True)
l.sort(key = lambda x : len(x))

v2를 활용한다면 숫자였다면 -x로 reverse를 대신할 수 있는데
l.sort(key = lambda x : (len(x), -x??????)
가 됐을 것이다. 하지만 이런 방법은 없다.
대신 v1처럼 stable을 이용해서 2번 정렬해야한다.

list.sort() vs sorted()

0개의 댓글