C언어 할때도 비슷한 문제를 많이 풀어봤었기에.. 이 문제도 C언어를 풀 때와 같은 방식으로 버블정렬을 통해 풀었다.
풀때도 이중 for문 때문에 시간초과가 날 것이라 예상했다.
그런데 len을 기준으로 문자열 정렬하는 함수가 파이썬에 있겠어?! 라고 생각했는데...
파이썬은 생각보다 대단했다..
n = int(input())
ar = []
result = []
for i in range(n):
str = input()
ar.append(str)
ar.sort()
for i in range(len(ar)):
for j in range(i, len(ar)):
if len(ar[i]) > len(ar[j]):
tmp = ar[i]
ar[i] = ar[j]
ar[j] = tmp
for i in range(len(ar)-1):
if ar[i] in ar[i+1 :]:
continue
else:
result.append(ar[i])
for i in result:
print(i)
C언어와 같은 방식으로 푼 코드
n = int(input())
ar = []
for i in range(n):
str = input()
ar.append(str)
#point : 정렬하는 순서
ar = list(set(ar)) #자동으로 순서 변환
ar.sort() #사전순으로 정렬
ar.sort(key= len) #길이를 기준으로 정렬
for i in ar:
print(i)
길이로 정렬하는 것은 물론이고 중복 제거하는 것 까지 내장되어있다니...!!!
하루하루 파이썬으로 코딩하면서 신세계를 느낀다.
sort()와 sorted()의 차이점
sort()
- 기존의 리스트를 정렬
- list.sort() 형식으로만 사용 가능
sorted()
- iterable 객체를 파라미터로 받는 메서드
- 대표적인 iterable: list, tuple, string, dict, set등
- 반환값으로 정렬된 새로운 리스트가 나옴
sort(key = len) -> sort()
ar.sort(key= len) #길이를 기준으로 정렬
ar.sort() #사전순으로 정렬
하지만 이 순서로 코딩을 하다 보면 길이를 기준으로 정렬한게 깨지고 사전순으로 정렬한 것만 남는다.
sort() -> sort(key=len)
ar.sort() #사전순으로 정렬
ar.sort(key= len) #길이를 기준으로 정렬
이렇게 하면 순서가 잘 정렬 된 것을 확인할 수 있다.
왜냐하면, key=len 일때 길이가 같은 문자열에 대해서는 앞서 정렬했던 사전순으로 정렬한 것을 그대로 따르기 때문!!
두 가지 기준으로 정렬하는 방법
ar = ["banana", "apple", "cherry", "date", "fig"]
# 길이를 기준으로 정렬한 후, 같은 길이의 요소들에 대해 사전순으로 정렬
ar = sorted(ar, key=lambda x: (len(x), x))
print("길이 및 사전순으로 정렬:", ar) # Output: ['fig', 'date', 'apple', 'banana', 'cherry']
lambda
- 이 함수는 두 개의 기준을 함께 사용하여 정렬을 수행할 수 있음
- 익명 함수로, 함수를 짧게 줄여서 쓰는 것
lambda a:b
lambda x:(len(x),x) #a=x, b=(len(x),x)
- a: 입력 인자(매개변수)
- b: 입력 인자를 이용하여 계산할 값. 즉, 계산하고 반환되는 값.
- lambda x: (len(x), x): x는 리스트의 각 요소
- len(x): 각 요소의 길이를 반환 (1번째 정렬 기준)
- x: 각 요소 자체를 반환 (2번째 정렬 기준)
- (len(x), x): 이 튜플을 반환함으로써 먼저 길이(len(x))를 기준으로 정렬하고, 길이가 같은 경우에는 요소 자체(x)를 기준으로 사전순 정렬을 수행
리스트 중복 제거 방식
for문
내가 푼 방식은 for문이다.
not in 으로 풀어도 된다.
result = []
for i in range(len(ar)-1):
if ar[i] in ar[i+1 :]:
continue
else:
result.append(ar[i])
set
# 원래 리스트
ar = ["apple", "banana", "apple", "cherry", "banana", "date", "fig", "cherry"]
# set을 사용하여 중복 제거
unique_ar = list(set(ar))
# 결과 출력
print(unique_ar) # 중복이 제거된 리스트
set 자료구조의 특징이 중복이 없다는 것!!
ar 리스트를 set으로 감싸서 중복을 제거해주고, 다시 list 자료형으로 바꿔준다.
주의할 점은, set은 요소들의 순서를 보장하지 않기 때문에 결과 리스트의 순서는 원래 리스트와 다를 수 있다!!
(빌드 할 때마다 리스트의 순서가 다르게 나옴)
만약 중복제거와 리스트 정렬을 함께 해야한다면, 필히 중복제거를 먼저 하고 정렬을 해야한다.
dictionary
dictionary의 키(key)가 고유하다는 점을 활용하여 중복을 제거할 수 있다!
# 원래 리스트
ar = ["apple", "banana", "apple", "cherry", "banana", "date", "fig", "cherry"]
# dictionary를 사용하여 중복 제거
unique_ar = list(dict.fromkeys(ar))
# 결과 출력
print(unique_ar) # 중복이 제거된 리스트
ar 리스트를 dict.fromkeys로 감싸서 키로 만들어 중복을 제거해주고, 다시 list 자료형으로 바꿔준다.
*dict.fromkeys의 인자로 들어온 데이터를 key 값으로 하여 딕셔너리 자료형을 만들어준다.
'Algorithm' 카테고리의 다른 글
[11650, 11651] 파이썬 한 줄 입력받기 (0) | 2024.07.10 |
---|---|
[1193] 분수찾기 (0) | 2024.07.09 |
[4673] 재귀함수를 사용한 셀프넘버 (0) | 2024.07.05 |
[1316] Python 문자열 찾는 함수 in (0) | 2024.07.04 |
파이썬 기본 문법 정복하기! / C언어랑 파이썬 비교 (2) | 2024.02.19 |