본문 바로가기

코딩테스트 문제

[Python] 프로그래머스 - 튜플(2019 카카오 개발자 겨울 인턴십)

프로그래머스 - 튜플 / 문제 유형 : 구현, 문자열 / 2019 카카오 개발자 겨울 인턴십 / Level 2

 

2019 카카오 개발자 겨울 인턴십에서 나온 문제이다.

문제 바로가기 - https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

Solution

1. 문자열 파싱

 : 주어진 문자열은  {{ , },{ }} 이런식으로 되어있다. strip()함수를 이용하여 양 끝에 있는  {{ 과 }}을 없애준 후, 각각의 데이터를 리스트로 저장해 주기 위해 '},{'을 단위로 문자열을 끊어준다.

이 과정을 거치면 입출력 예 1 은 다음과 같이 된다.

파싱 전 파싱 후
"{{2},{2,1},{2,1,3},{2,1,3,4}}" ['2', '2,1', '2,1,3', '2,1,3,4']

그 다음 위의 문자열을 ',' 단위로 끊어준 후 list의 형태로 data라는 변수에 저장해 준다

 

2. 정렬

 : 파싱된 문자열의 길이는 각각의 원소를 뜻한다. 무슨말이냐면, 길이가 1인 원소는 a1을 뜻하고 길이가 2인 원소는 a1,a2를 뜻한다.

즉, a1부터 문자열에 넣어주기 위해 정렬 과정을 거쳤다.

 

3. 튜플 만들기

 :  길이대로 정렬되었기 때문에 길이가 2인 원소에서 a1을 제거하면 a2를 구할 수 있다. 이 과정을 반복하면 아래와 같다.

a1 2 a1 = 2
a1,a2 2,1 a2 = 1
a1, a2, a3 2,1,3 a3 = 3
a1, a2, a3, a4 2,1,3,4 a4 = 4

위와 같이 구현해주기 위해 subdata를 만들어 data안에 있는 원소들을 하나씩 가져온다. 

subdata안에 answer의 원소가 존재하면 remove 해준 후 남은 원소를 answer에 append 해준다.

(subdata안에 있는 원소를 answer에 넣어주기 때문에 answer안에는 항상 subdata가 존재하게 된다.)

import sys

def solution(s):
    answer = []
    
    s2 = s.strip("{,}").split('},{')
    data = []
    for a in s2:
        data.append(list(map(int,a.split(',')))) 
    
    data.sort(key=len)
    
    for i in range(len(data)):
        subdata = list(data[i])
        for a in answer:
            subdata.remove(a)
        answer.append(subdata[0])  
    
    return answer