로직
1. s = "{{2},{2,1},{2,1,3},{2,1,3,4}}" 를 s = [{2}, {2,1}, {2, 1, 3}, {2, 1, 3, 4}]로 바꾼 후 set안에 들어있는 갯수가 1부터
나열될 수 있도록 정렬한 후, result 안에 없는 값들만 넣어주기
2. 주의 : 원래 s[1:-1].split(',')해서 할랬는데, ['{20', '111}', '{111}']가 되어버린다. 이거를 문자열 안에 {}도 있어서
뽑아 내야하는 것들이 많다.
-> s = s[2:-2].split('},{')하면 ['20, 111', '111']로 나온다.
코드
def solution(s):
result = []
ss = s[2:-2].split('},{') # ['20,111', '111']
sss = sorted(ss, key=lambda x: len(x))
for i in sss:
res = list(i.split(',')) # '20, 111'인 경우 [20, 111]로 잘라야함
if len(res) == 1:
result = [int(res[0])]
else:
print(result)
for r in res:
if int(r) not in result:
result.append(int(r))
return result
다른사람 코드 (정규방정식 이용)
# 원소의 갯수가 가장 많은 순서대로 리스트에 담기
import re
from collections import Counter
def solution1(s):
s = Counter(re.findall('\d+', s)) # \d+ : 숫자 -> # Counter({'2': 4, '1': 3, '3': 2, '4': 1})
ss = sorted(s.items()) # [('1', 3), ('2', 4), ('3', 2), ('4', 1)]
return list(map(int, [k for k, v in sorted(ss, key=lambda x: x[1], reverse=True)]))
주의할 점
1. ** 문제점 : result 안에 있는 값은 넣으면 안된다. 이때 if int(r) not in result: 해야함
** 해결책 : 기본적으로 str이기 때문에 int로 바꿔서 비교하지 않으면 다른 값으로 인지하고 result에 추가적으로 들어간다
2. ** 문제점 : ss를 split한 후 sort하면 s = "{{1,2,3},{2,1},{1,2,4,3},{2}}" 이런 경우 ['1, 2, 3', '1, 2, 4, 3', '2', '2, 1']
** 해결책 : 기본적으로 str이기 때문에 int로 바꿔서 비교하지 않으면 다른 값으로 인지하고 result에 추가적으로 들어간다
'알고리즘' 카테고리의 다른 글
[programmers] 오픈채팅방 (0) | 2020.09.01 |
---|---|
[programmers] 뉴스 클러스터링 (0) | 2020.08.31 |
[programmers] 다트 게임 (0) | 2020.08.31 |
[baekjoon] 14888. 연산자 끼워넣기 (0) | 2020.08.19 |
[baekjoon] 14889. 스타트와 링크 (0) | 2020.08.18 |