티스토리 뷰

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

 

프로그래머스

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

programmers.co.kr


1. 접근 방식

  • s를 각 집합을 원소로 갖는 리스트로 바꾸자.

s가 "{ {2, 1}, {1}, {1, 3, 2} }"라는 문자열이라면, 이를 sets = [ {2, 1}, {1}, {1, 3, 2} ]처럼 실제 집합을 원소로 갖는 리스트로 변환함으로써 더욱 쉽게 문제를 풀 수 있을 것이라고 생각했다.

 

  • sets 리스트를 각 집합의 길이를 기준으로 오름차순 정렬한다.

기존 튜플이 (1, 2, 3)이라면, n-튜플은 {1}, {1, 2}, {1, 2, 3}이다. 즉, i번째 집합에 (i - 1)번째 집합에 없던, 새로 등장한 원소는 기존 튜플에서 i번째 위치에 있는 원소이다. i = 3일 때 3번째 집합인 {1, 2, 3}과 2번째 집합인 {1, 2}를 비교하면, 새로 등장한 원소는 3이며, 3은 기존 튜플에서 3번째 위치에 존재함을 확인할 수 있다. 따라서 sets 리스트를 각 집합의 길이를 기준으로 오름차순 정렬해야 한다.

리스트의 원소가 집합이기 때문에 sort( ) 메서드를 사용하면, 바로 집합 길이를 기준으로 정렬된다. 그러면 리스트 sets는 [ {1}, {2, 1}, {1, 3, 2} ]이 된다.

 

  • sets 리스트를 순회하면서 각 집합의 원소 중 answer 리스트에 속하지 않는 원소를 answer에 추가한다.

sets 리스트를 순회하면 {1}, {2, 1}, {1, 3, 2} 집합을 만나게 된다. 이때 각 집합의 원소 중 answer 리스트에 없는 원소를 answer에 추가하면 정답이다. 예를 들어 현재 집합 {1, 3, 2}에서 3을 제외한 1과 2는 이미 answer 리스트에 존재하기 때문이다.

 

 

2. 정답 코드

def change_to_list(_list):
    result = []
    for pair in _list[2:-2].split('},{'):
        result.append(set(map(int, pair.split(','))))
    return sorted(result)

def make_answer(_list):
    result = []
    for _set in _list:
        for e in _set:
            if e not in result:
                result.append(e)
    return result
    
def solution(s):
    sets = change_to_list(s)

    return make_answer(sets)

 

 

3. 기타

def change_to_list(data):
    result = []
    
    pair = ''
    for x in data[1:-1]:
        if not pair and x == ',':
            continue
            
        pair += x
        
        if x == '}':
            result.append(eval(pair))
            pair = ''
            
    return sorted(result)

가장 처음에 구현했던 change_to_list( ) 코드이다. data[1:-1]를 처음부터 끝까지 전체 순회하는 방식이다.

이와 달리 2. 정답 코드에서는 split( ) 메서드를 사용하여 똑같은 기능을 더욱 짧은 코드로 구현하였다.

728x90