[Programmers][Level2][Pyton] 튜플

냥린이·2022년 1월 13일
0

알고리즘

목록 보기
16/28
post-thumbnail

문제

https://programmers.co.kr/learn/courses/30/lessons/64065

풀이

튜플이란?

  • 리스트와 유사하지만 ()를 사용하며 ()는 생략이 가능하다.
  • 원소값의 수정이 불가능하다. (제일 중요!)
  • 인덱싱, 슬라이싱, 연산, 길이 구하기는 가능하다.
  • 원소가 1개일 경우 원소 뒤에 ,(콤마)를 붙여야 한다.

집합이란?

  • 원소 중복을 허용하지 않는다.
  • 순서가 존재하지 않으므로 인덱싱이 불가능하다.

중복되는 원소가 없다는 튜플이라는 점에서 집합이랑 비슷하다고 느꼈다.. 암튼 시작해보면!

Trial 1st 풀이

print(type(s))로 확인해보니 입력이 str로 들어오고 있었다.

{}와 , 로 구분되어 있으므로 인덱스 슬라이싱과 split을 활용해서 원소만 뽑아 리스트로 만들어준다.

# 원소만 추출해서 리스트에 저장
    s = s[2:-2]
    num = s.split('},{')

이 다음을 살짝 헤맸다. 맨 처음 접근한 방법은,

  1. 원소를 집합으로 구분하지 않고 전부 추출하고
  2. 몇 번 등장하는지 count해서
  3. 딕셔너리 형태로 저장하여
  4. 키 (등장 횟수) 역순으로 뒤집은 후
  5. 값만 출력해준다.
# 튜플 만들기
    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번까지 하다가 포기했다.

Trial 2nd 풀이

우선 딕셔너리의 경우 저장까지는 편하지만 원하는 순서대로 정렬하고 값만 출력하는 게 번거로웠다.

근본적인 원인은 키 순서가 엉망이라는 것인데, 집합 단위의 원소를 길이 순서 (집합 안에 든 원소의 개수가 많은 순)으로 정렬할 필요가 있었다.

파이썬이 제공하는 내장 정렬 함수는 크게 2가지가 있다.

  1. list.sort()

    • list에서만 사용 가능
    • in-place 하게 제자리에서 정렬 후 None 반환
    l = [1, 3, 4, 2]
    l.sort()
    print(l) # 1, 2, 3, 4
  2. sorted(iterable)

    • 모든 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

profile
홀로서기 기록장

0개의 댓글