https://programmers.co.kr/learn/courses/30/lessons/64065
튜플이란?
,(콤마)
를 붙여야 한다.집합이란?
중복되는 원소가 없다는 튜플이라는 점에서 집합이랑 비슷하다고 느꼈다.. 암튼 시작해보면!
print(type(s))로 확인해보니 입력이 str로 들어오고 있었다.
{}와 , 로 구분되어 있으므로 인덱스 슬라이싱과 split을 활용해서 원소만 뽑아 리스트로 만들어준다.
# 원소만 추출해서 리스트에 저장
s = s[2:-2]
num = s.split('},{')
이 다음을 살짝 헤맸다. 맨 처음 접근한 방법은,
# 튜플 만들기
answer = dict()
while len(num)>0:
e = num[0]
i = num.count(e)
print(e, i)
answer[i] = int(e)
while e in num:
num.remove(e)
answer = sorted(answer.items(), reverse=True)
였는데 대충 4번까지 하다가 포기했다.
우선 딕셔너리의 경우 저장까지는 편하지만 원하는 순서대로 정렬하고 값만 출력하는 게 번거로웠다.
근본적인 원인은 키 순서가 엉망이라는 것인데, 집합 단위의 원소를 길이 순서 (집합 안에 든 원소의 개수가 많은 순)으로 정렬할 필요가 있었다.
파이썬이 제공하는 내장 정렬 함수는 크게 2가지가 있다.
list.sort()
l = [1, 3, 4, 2]
l.sort()
print(l) # 1, 2, 3, 4
sorted(iterable)
l = [1, 3, 4, 2]
sorted(l)
print(l) # 1, 3, 4, 2 출력
list.sort()와 sorted()는 모두 key 매개 변수를 갖는다. key 매개 변수란 정렬 함수가 각 리스트 요소를 정렬하기 전에 호출할 함수는 지정한다.
다음처럼 활용될 수 있다.
sorted("This is a test string from Andrew".split(), key=str.lower)
# ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
sorted(student_tuples, key=lambda student: student[2])
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
더 알아보기
Sorting HOW TO - Python 3.10.1 documentation
리스트 요소를 길이 순서로 정렬하고 싶다면 key 매개 변수에 len을 주면 된다. list.sort()
와 sorted(iterable)
에서 모두 동작한다.
# 리스트 내 원소 개수 순으로 정렬
s.sort(key=len)
이렇게 하면 원소가 1개인 것부터 n개인 것까지 차례로 정렬된다.
튜플에서 0번째 원소는 모든 부분집합에 다 들어있고 -1번째 원소는 마지막 부분집합에만 들어있다. 따라서 원소 개수 순으로 정렬할 상태에서 원소가 등장하는 순서로 저장해주면 원하는 결과가 된다.
# 부분집합에서 원소 하나씩 분리
for i in s:
j = i.split(",")
# 원소 출현 빈도순으로 저장 (등장 빈도가 많을수록 튜플에서 앞 순서)
for k in j:
if not int(k) in answer:
answer.append(int(k))
전체 코드는 다음과 같다.
def solution(s):
answer=[]
# 집합만 추출해서 리스트에 저장
s = s[2:-2]
s = s.split('},{')
# 집합 내 원소 개수 순으로 정렬
s.sort(key=len)
# 원소 하나씩 분리
for i in s:
j = i.split(",")
# 원소 등장 빈도순으로 저장 (등장 빈도 순위는 튜플 내 순서와 동일)
for k in j:
if not int(k) in answer:
answer.append(int(k))
return answer