Doby's Lab

백준 1431번: 시리얼 번호 (Python), Lambda Expression 본문

PS/BOJ

백준 1431번: 시리얼 번호 (Python), Lambda Expression

도비(Doby) 2023. 10. 28. 15:43

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

 

1431번: 시리얼 번호

첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어

www.acmicpc.net


Level: Silver III

Solved By: Sort, ASCII

 

1. char to int

파이썬에는 char에 대한 ASCII를 반환해 주는 ord() 함수가 있습니다. ord는 Ordinal Position의 약자로 문자의 원래 위치를 의미한다고 합니다.

 

이 함수를 이용하여 ord('9') (9의 ASCII 값)를 넘지 않는, 즉 숫자인 문자에 대해서 ord('0') (0의 ASCII 값)을 빼주면 char에 대한 int 타입의 데이터가 변환됩니다. 이를 활용하여 오직 숫자 값들에 대해서만 덧셈을 해줄 수 있습니다.

 

2. 정렬, 람다 표현식(lambda expression)

C++에서는 원하는 기준으로 정렬을 해줄 때, 3번째 bool type 리턴 함수를 선언하여 넘겨주면 원하는 대로 정렬이 가능했습니다.

 

파이썬에서는 이에 대해 람다 표현식을 이용하여 sort() 함수의 key 매개변수에 할당을 시켜주면 됩니다.

람다 표현식을 사용하면 코드가 단순해지는 것도 맞지만, 함수를 선언하는 것 자체만으로 메모리를 할당시키기 때문에 람다 표현식을 통해 일회성으로 사용하여 메모리를 아낄 수 있다는 장점이 있습니다.

 

람다 표현식은 아래와 같은 형태로

lambda argument : result

예를 들어, 어떠한 값에 대해 10을 더해주는 람다 표현식 함수를 만들어준다고 한다면 아래와 같이 선언할 수 있습니다.

lambda x : x + 10

 

그리고, 정렬 함수에서도 기준이 여러 개 있을 때는 튜플을 통해 여러 기준들을 만들어줄 수 있으며, 튜플의 첫 원소부터 첫 기준으로 할당이 됩니다. 이러한 원리를 문제 적용하면 아래와 같이 정렬 기준을 만들어 줄 수 있습니다.

li.sort(key=lambda x: (len(x), sum_num(x), x))

 

import sys

N = int(sys.stdin.readline())
li = []

def sum_num(n):
    ret = 0
    for i in range(0, len(n)):
        elem = n[i]
        if ord(elem) <= 57:
            ret += (ord(elem) - 48)
    return ret

for i in range(0, N):
    num = input()
    li.append(num)
    # print(sum_num(num))
    
li.sort(key = lambda x : (len(x), sum_num(x), x))

for v in li:
    print(v)

 

 

728x90