본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv2 튜플 (python)

by 개발하는 호랑이 2024. 2. 13.

튜플

 

풀이

보면서 진짜 이건 어떻게 풀지 하고 있다가, 보니, 뭘해도 결국 1개만 있는 것은 나와야했다.
이를 바탕으로 풀이를 해보려고 진행했다.
일단 문자열 형태로 되어있어서, 이것을 리스트 형태로 바꿔줄 필요가 있었기에 이를 조정했다.
1. 문자열을 리스트 형태로 변환
2. 생성된 리스트를 기반으로 리스트 안의 리스트의 길이를 기준으로 오름차순 정렬
3. for문을 돌면서 리스트 안의 리스트가 가진 요소를 answer에 기입하고, 이 때 이미 기입이 되지 않은 요소들만 계속 추가
4. 마지막으로 answer를 반환

# 1개짜리 2개짜리 3개짜리...에 들어있는 숫자 순으로 입력되어있음
# 이를 모두 리스트로 바꿔놓고, 해석하면 될 듯
# 우선 숫자의 길이만큼을 오름차순으로 리스트로 변환


def solution(s):
    t_list = []
    t_number = ''
    for i in range(len(s)):
        if i == 0:
            pass
        elif i == (len(s)-1):
            pass
        # 열린괄호
        elif i != 0 and i != (len(s)-1) and s[i] == '{':
            t_list.append([])
            t_number = ''
        # 닫힌괄호
        elif i != 0 and i != (len(s)-1) and s[i] == '}':
            t_list[-1].append(int(t_number))
            t_number = ''
        # 쉼표
        elif i != 0 and i != (len(s)-1) and s[i] == ',' and s[i-1] != '}':
            t_list[-1].append(int(t_number))
            t_number = ''
        # 그 외
        else:
            t_number += s[i]
    # 답을 담을 answer 리스트 생성
    answer = []
    # 내부 리스트 길이를 기준으로 오름차순한 정렬
    s_list = sorted(t_list, key = len)
    
    # 리스트 순회하면서, 리스트 내 숫자 순회
    for i in range(len(s_list)):
        for j in range(len(s_list[i])):
            # asnwer에 입력된 숫자가 아니면 answer에 입력
            if s_list[i][j] not in answer:
                answer.append(s_list[i][j])
    return answer

후후... 이를 더 쉬운 방법으로?? 하니 아래와 같다.
어차피 맨 처음에 있는 요소는 4개의 집합이 있을 때, 4번 등장하니 이를 기준으로 삼아서 생성하는 것이다.
이런 방법도 잘 기억해둬야지.

def solution(s):
    # 문자열에서 숫자 부분만 추출하여 리스트로 변환
    numbers = list(map(int, s.replace('{', '').replace('}', '').split(',')))
    # 숫자의 등장 횟수를 세어서 (숫자, 등장 횟수)의 튜플로 구성된 리스트 생성
    counts = [(x, numbers.count(x)) for x in set(numbers)]
    
    # 등장 횟수를 기준으로 정렬하고, 숫자만 추출하여 리스트로 변환
    answer = [x for x, _ in sorted(counts, key=lambda x: x[1], reverse=True)]
    
    return answer

다른 사람 풀이

파이썬의 학교에 정규식의 등장이라니

정규식 멋지다

def solution(s):

    s = Counter(re.findall('\d+', s))
    return list(map(int, [k for k, v in sorted(s.items(), key=lambda x: x[1], reverse=True)]))

import re
from collections import Counter