티스토리 뷰

🚀접근하기

전형적인 정렬 문제이다. 2중 for 문을 사용해서 순서대로 리스트의 시리얼 번호들을 비교해서 정렬해주는 방법을 생각했다.

근데... 알고보니 lambda식을 이용한 획기적인 정렬법이 있었으니...

🎉코드

 

<처음 코드>

import sys

N = int(sys.stdin.readline())

serial = []

# 주어진 문자열 s에서 숫자들의 합을 계산하는 함수
def sum_of_digits(s):
    total = 0
    for char in s:
        if char.isdigit():
            total += int(char)
    return total

for i in range(N):
    serial.append(sys.stdin.readline().strip())

for i in range(len(serial)-1):
    for j in range(i+1, len(serial)):
        # 조건 1: 두 시리얼 번호의 길이를 비교
        if len(serial[i]) > len(serial[j]):
            serial[i], serial[j] = serial[j], serial[i]

        # 조건 2: 길이가 같으면, 숫자들의 합을 비교
        elif len(serial[i]) == len(serial[j]):
            if sum_of_digits(serial[i]) > sum_of_digits(serial[j]):
                 serial[i], serial[j] = serial[j], serial[i]

             # 조건 3: 길이도 같고 숫자 합도 같으면, 사전순으로 비교
            elif sum_of_digits(serial[i]) == sum_of_digits(serial[j]):
                if serial[i] > serial[j]:
                    serial[i], serial[j] = serial[j], serial[i]                

for i in range(N):
    print(serial[i])

 

정말 조건 그대로 코드를 작성해주었다.

문자열에서 숫자들만 고려해서 숫자들의 합을 비교하는 2번째 조건은 따로 함수를 만들어 처리해주었다.

3번째 조건은 다행히 파이썬의 기본 문자열 비교 기능을 통해 사전순으로 정렬해줄 수 있어 간편하게 코드를 작성해주었다.

 

그러나.. 생각보다 보기도 어렵고 복잡하다

 

.

.

.

 

<lambda식을 활용한 코드>

import sys

N = int(sys.stdin.readline())

serial = []

# 주어진 문자열 s에서 숫자들의 합을 계산하는 함수
def sum_of_digits(s):
    total = 0
    for char in s:
        if char.isdigit():
            total += int(char)
    return total

for i in range(N):
    serial.append(sys.stdin.readline().strip())

# serial 리스트의 요소를 정렬 기준에 따라 정렬
# 1. 요소(시리얼 번호)의 길이가 짧은 것부터
# 2. 요소 내 숫자들의 합이 작은 것부터
# 3. 사전순
serial.sort(key = lambda x:(len(x), sum_of_digits(x), x))

for i in serial:
    print(i)

 

코드가 이렇게 짧아지고 간결해질 수 있는 것인가...

입력을 받아와 리스트에 넣어주는 것과, 숫자들의 합을 계산하는 두번째 조건의 함수까진 동일한 코드이다.

 

중요한 건 serial.sort(key = lambda x:(len(x), sum_of_digits(x), x)) 이 코드인데,

파이썬의 리스트 sort() 메서드를 사용하여 serial 리스트 내의 요소들을 특정 기준에 따라 정렬하는 한 줄짜리 간결한 방식이다.

lambda 함수는 여기서 정렬 기준을 정의하는 데 사용된다. lambda x: (len(x), sum_of_digits(x), x)는 각 요소 x에 대해 정렬 기준을 튜플로 반환하는데, 이 튜플은 정렬 시 여러 기준을 순차적으로 적용하게 만들어준다.

따라서 3개의 조건이 순차적으로 적용되어 위의 복잡한 2중 for문이 단 한줄로 간결하게 바뀌었다!!

💪다짐

lambda 식을 활용한 획기적인 정렬법을 계속해서 써먹어야겠다.

또한 코드를 작성하는 과정에서 주석을 꾸준히 달아야겠다고 다짐했다. 주석을 달아야 코드 해석도 쉽고, 나중에 봐도 바로 이해가 되기 때문이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함