https://www.acmicpc.net/problem/1431
문제를 풀면서 몰랐던 개념
(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]
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 수 정렬하기 4 : 11931번 - Python (0) | 2021.07.19 |
---|---|
[백준] N번째 큰 수 : 2693번 - Python (0) | 2021.07.18 |
[백준] 중복 빼고 정렬하기 : 10867번 - Python (0) | 2021.07.16 |
[백준] 점수 계산 : 2822번 - Python (0) | 2021.07.16 |
[백준] 접미사 배열 : 11656번 - Python (0) | 2021.07.16 |