티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/64065
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( ) 메서드를 사용하여 똑같은 기능을 더욱 짧은 코드로 구현하였다.
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 파이썬 정답 코드 (0) | 2023.06.15 |
---|---|
[프로그래머스] [1차] 캐시 파이썬 정답 코드 (0) | 2023.06.15 |
[프로그래머스] 신고 결과 받기 파이썬 정답 코드 (0) | 2023.06.14 |
[프로그래머스] 성격 유형 검사하기 파이썬 정답 코드 (0) | 2023.06.13 |
[프로그래머스] 신규 아이디 추천 파이썬 정답 코드 (0) | 2023.06.13 |