https://www.acmicpc.net/problem/1431
문제
다솜이는 기타를 많이 가지고 있다. 그리고 각각의 기타는 모두 다른 시리얼 번호를 가지고 있다. 다솜이는 기타를 빨리 찾아서 빨리 사람들에게 연주해주기 위해서 기타를 시리얼 번호 순서대로 정렬하고자 한다.
모든 시리얼 번호는 알파벳 대문자 (A-Z)와 숫자 (0-9)로 이루어져 있다.
시리얼번호 A가 시리얼번호 B의 앞에 오는 경우는 다음과 같다.
- A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
- 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
- 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.
시리얼이 주어졌을 때, 정렬해서 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 기타의 개수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어져 있다. 시리얼 번호는 중복되지 않는다.
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
32
33
34
35
36
37
38
39
40
41
|
import functools
def intsum(string):
sum = 0
for i in string:
if 48 <= ord(i) <= 57:
sum += int(i)
return sum
def compare(str1, str2):
if len(str1) > len(str2): # 첫번째 조건
return 1
elif len(str1) < len(str2):
return -1
strint1 = intsum(str1)
strint2 = intsum(str2)
if strint1 > strint2: # 두번째 조건
return 1
elif strint1 < strint2:
return -1
if str1 > str2: # 세번째 조건
return 1
else:
return -1
n = int(input())
strList = []
for i in range(n):
str = input()
strList.append(str)
ansList = sorted(strList, key=functools.cmp_to_key(compare))
for item in ansList:
print(item)
|
cs |
intsum(string)
문자열 속 숫자를 모두 더해서 리턴해주는 함수.
문자와 숫자를 구별할 별다른 방법이 생각나지 않아서 C에서 하던 것처럼 아스키 코드로 판별했음
compare(str1, str2)
문제의 정렬 조건에 따라 str1과 str2를 비교하는 함수
1)시리얼의 길이 - 2)시리얼 번호 속 숫자의 합 - 3)사전순으로 비교하고, str1 > str2면 1, 반대의 경우 -1를 리턴함
sorted()의 key 파라미터에 집어넣을 용도로 만든 함수임
Key skills
sorted() 함수의 key로 정렬 조건을 담고 있는 비교 함수를 전달하면 알아서 정렬해줌.
첫번째 인자가 두번째 인자보다 우선순위가 높으면 양수를 리턴하고, 반대의 경우 음수를 리턴하도록 짜면 됨(아래 코드의 compare() 참고).
둘의 우선순위가 같은 경우는 양수를 리턴하든 음수를 리턴하든 상관 없음
다만, key=compare처럼 비교함수를 날것의 상태로 바로 집어넣으면 파이참이 생난리를 피움
key=functools.cmp_to_key(compare)처럼 표준 라이브러리의 functools 모듈에 포함된 cmp_to_key() 함수를 한 번 거쳐서 집어넣어줘야 함
'Problem Solving > Baekjoon' 카테고리의 다른 글
백준 14500번 - 테트로미노(C++) (1) | 2021.09.24 |
---|---|
백준 2812번 - 크게 만들기(Swift) (4) | 2021.05.07 |
백준 9519번 - 졸려(Python) (0) | 2020.08.12 |
백준 2675번 - 문자열 반복(Python) (0) | 2020.02.27 |