티스토리 뷰


🚀접근하기
전형적인 정렬 문제이다. 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 식을 활용한 획기적인 정렬법을 계속해서 써먹어야겠다.
또한 코드를 작성하는 과정에서 주석을 꾸준히 달아야겠다고 다짐했다. 주석을 달아야 코드 해석도 쉽고, 나중에 봐도 바로 이해가 되기 때문이다.
'알고리즘' 카테고리의 다른 글
| [알고리즘] 백준 4963 섬의 개수 파이썬 (0) | 2025.01.07 |
|---|---|
| [알고리즘] 백준 1326 폴짝폴짝 파이썬 (0) | 2025.01.06 |
| 백준 파이썬 1713 후보 추천하기 (0) | 2024.02.29 |
| 백준 파이썬 5212 지구 온난화 (1) | 2024.02.27 |
| 백준 파이썬 1456 거의 소수 (1) | 2024.02.26 |
- Total
- Today
- Yesterday
- JPA
- DP
- 로깅
- 백준
- 웹 MVC
- 로그아웃
- 다이나믹 프로그래밍
- 프론트엔드
- elasticsearch
- 자바
- 백준 파이썬
- 파이썬
- 비영속
- 스프링
- EnumType.ORDINAL
- 지연로딩
- 웹MVC
- 준영속
- 북마크
- 자바 스프링
- 커뮤니티
- SQL 레벨업
- 스프링 커뮤니티
- SQL
- 회원탈퇴
- SQLD
- 영속
- 스프링 북마크
- 인텔리제이
- 스프링부트
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |