본문 바로가기

알고리즘

[programmers] 튜플


로직

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