본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 시리얼 번호 : 1431번 - Python

728x90
반응형

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

 

1431번: 시리얼 번호

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

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

(1) [Python] 리스트의 다중 조건 정렬

-> lamda 함수의 사용 & sort 함수의 사용

arr = list(map(int, input()))
arr.sort(key=lambda x: (len(x), x))
# 리스트 arr를 길이 순으로 정렬하고, 길이가 같다면 사전 순으로 정렬하기

리스트에서 다중 조건을 기준으로 정렬할 때는 lamda 함수를 사용해서 조건을 명시해준 후, sort 함수를 통해 정렬하는 것이 좋다.

 

(2) 길이 순 정렬, 사전 순 정렬

-> 위에 써있는 코드처럼 주어진 조건을 순서대로 걸어주면 된다.

 

(3) 문자열에서 정수 판별하기

-> isdigit() 메소드 사용하기

arr = 'ABC17'
sum = 0

for i in arr:
    if i.isdigit():
        sum += int(i)
print(sum)

>>> 8

^ 문자열 'ABC17' 에서 정수만 판별하여 그 값들의 합을 구하려면 다음과 같이 하면 된다.

 

 

 

문제의 접근 방법

 

- 주어진 정렬 조건들을 하나하나씩 어떻게 구현할 수 있을지 고민해 본 후 합치기.

- 문자열에서 정수를 추출하는 방법 생각해보기.

- 함수 사용해보기.

 

 

내가 막혔던 부분

 

(1) 다중 조건 정렬을 위한 lamda 함수의 사용법.

(2) 길이가 짧은 것 순으로 비교하는 방법.

(3) 문자열에서 정수만 추출해서 각 자릿수의 합을 구하는 방법.

(4) 함수 선언 후 호출하는 방법.

 

 

 

문제 풀이 방법

 

- 입력 받을 시리얼 번호의 개수 n개 입력받기

- n개의 시리얼 번호 입력받기

- 정렬 조건을 하나씩 기준으로 삼아 입력 받은 시리얼 번호를 정렬하기

(1) 두 개의 길이 비교 => 짧은 것 순으로 정렬

(2) 문자열 중 정수들의 합을 비교 => 작은 것 순으로 정렬

(3) (1),(2) 가 모두 똑같다면 => 사전 순으로 비교(숫자가 알파벳보다 사전순으로 작음.)

 

 

 

소스코드

n = int(input())

def num_sum(string):
    result = 0

    for i in string:
        if i.isdigit():
            result += int(i)

    return result

arr = []
for i in range(n):
    if (n<=1000):
        serial = input()
        
        if len(serial) <= 50:
            arr.append(serial)
            arr.sort(key=lambda x: (len(x), num_sum(x), x))

[print(i) for i in arr]
728x90
반응형