2019 카카오 개발자 겨울 인턴십 튜플
문제: programmers.co.kr/learn/courses/30/lessons/64065
코딩테스트 연습 - 튜플
"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]
programmers.co.kr
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
def solution(s):
answer = [[] for _ in range(501)]
check=[0 for _ in range(100001)]
maxLen=0
ans=[]
s=s[1:-1]
s=s.split('},')
for val in s:
if val[-1]!='}':
val=val[1:].split(',')
maxLen=max(maxLen,len(val))
answer[len(val)].append(list(map(int,val)))
else:
val=val[1:-1].split(',')
maxLen=max(maxLen,len(val))
answer[len(val)].append(list(map(int,val)))
for i in range(1,maxLen+1):
val=answer[i][0]
for x in (val):
if check[x]==0:
ans.append(x)
check[x]=1
return ans
|
cs |
이 문제를 처음에 풀었을 때 위와 같이 풀었다.
값을 추출할 때 어떤식으로 접근해야 할지 감이 안와서 처음과 끝을 잘라낸 다음에 split을 }, 로 하고 나면
마지막 값을 제외하고 나머지는 '{1,2,3,4' 식으로 된다.
그래서 if 와 else문으로 조건을 나누고 해당 크기에 따라 answer에 append한다.
예를 들어 val='{4,2,3' 이라 하자
그러면 val=val[1:].split(',')을 하면 val=['4','2','3']이 된다.
answer[3].append([4,2,3]) 이런식으로 흐름이 전개된다.
그러고 나서 리스트의 크기의 순서에 따라 알파벳을 확인한다.
확인하는 작업은 check에 0,1 에 따른 구분으로 값의 유무를 확인하고 나서 append한다.
|
1
2
3
4
5
6
7
|
import re
from collections import Counter
def solution5(s):
s = Counter(re.findall('\d+', s)).most_common()
return list(map(int, [k for k, v in s]))
|
cs |
위의 코드는 프로그래머스에서 상위권에 있는 코드를 변형하였다.
우선 re.findall('\d+',s)를 알아보자면 findall은 해당 조건에 대한 값을 다 찾는 것을 의미하고
'\d+'는 모든 숫자를 의미한다. (='[0-9]+') 그리고 Counter는 해당 리스트 값과 개수를 사전 형식으로 만들어준다. most_common()은 갯수가 많은 순으로 정렬하는 메소드이다. Counter와 most_common()은 많이 쓰이므로 알아두는 것이 좋다.
|
1
2
3
4
5
6
7
8
9
10
11
|
import collections
def solution4(s):
answer = []
s=s.lstrip('{').rstrip('}').split('},{')
for val in s:
val=val.split(',')
for v in val:
answer.append(int(v))
s=collections.Counter(answer).most_common()
return [k for k,v in s]
|
cs |
이 코드에서 주목할 것은 lstrip과 rstrip의 사용과 split에 대한 기준이다.
위와 같이 하면 왼쪽으로는 '{'은 다 사라지고 오른쪽으로는 '}'이 사라진다. 그리고 split을 },{ 을 하면 숫자들과 ','만 남게 되므로 ','로 split 한다음에 리스트에 값을 저장한다. 그 다음은 위에서 말했으므로 생략한다.