2010.04.07 10:53 WarGame




10번이군요

a[30]의 길이를 구하라고 합니다

소 모양의 링크를 따라 들어가면

a = [ 1, 11,  21 , 1211, 1112221 ,

책을 많이 읽은 분은 혹시 알아챘을지도 모르겠는데

베르나르 베르베르의 소설 , 개미에 나오는 '개미수열'입니다

2개씩 끊어서 보시면 돼는데

11은 1개의 1

21은 2개의 1

1211은 1개의 2 , 1개의 1

...

이런식으로 쭉 가게 되구요

좀 더 이 수열을 살펴보게 되면

4는 나오지 않는다는 것을 확인할 수 있습니다

예를 들어, 4가 나오려면 1 1 1 1 과 같이 같은 수가 4개 연속으로 나와야 하는데

사실 2,2개씩 나눠서 읽는 개미수열에서는 4 는 나올 수 없게 되는거죠

아무튼 개미수열이라는 것을 알았고

다음 수열을 구하기 위해서는

앞에서부터 중복되지 않은 숫자의 개수와, 그 수를 체크해야합니다




짜고 보니 매우 C언어스럽습니다

코드도 지저분 하구요

for 문 바깥에 있는 부분

result.append(str(cnt))
 result.append(i)
 


은 마지막 숫자를 염두해두었는데

예를 들어 11 이라고 하면

21 로 표현되어야 하는데 리스트의 마지막까지 가버렸기 때문에 for문 조건을 만족해서

튀어나와 버리고 append가 되지 않았기 때문에 붙여줬습니다만, 보기 싫으니

이것도 일반항으로 묶어버립시다

리스트에 1,2 이외의 문자를 하나 넣으면 되겠죠

또한 if, else 문을 하나로 줄이고

이를 위해서는 리스트에 직접 접근하는게 좋겠군요

cnt 를 좀 더 세분화 시켜야 합니다

start, end 로 나눠보면 쉽겠죠



Python의 스멜은 아직도 나지 않는군요 -.-

풀고 나서 다른 풀이를 보니

향긋한 Python 스멜을 풍기는 것을 발견했습니다

바로 itertools 모듈에 있는 groupby 함수를 쓰는 건데요

groupby 함수는 연속된 수를 묶어주는 역할을 합니다

다음은 groupby의 사용예 입니다





data 이외에 keyfunc를 줘서 group화하는 조건을 변경 할 수도 있습니다

이 예로는 다음과 같습니다


 
출처 :  파이썬 마을 , http://bbs.python.or.kr/viewtopic.php?t=23751

위 소스의 결과는

a1 ['c', 'd', 'g']
c2 ['d', 'g', 'f', 'a', 'h']

이구요

본론으로 넘어가서 우리가 구하고자 하는 개미 수열은 keyfunc 이 필요없는 관계로

인자를 하나만 넣어줘도 됩니다

예를 들어

1,1,2,1 을 groupby 함수의 인자로 주면

첫번째 리턴값으로 그 수를, 두번째로 그 수로 그룹화된 모임의 주소를 리턴해주게 됩니다

group화된 숫자 ,  group화된 모음의 주소 

이 주소를 list 나 tuple 로 변환하면

1 [ 1,1 ]
2 [ 2]
1 [1]

가 되겠죠

이를 적용하여 , 파이썬의 자료형  Dictionary 와 결합합니다

Dictionary 의 경우, 말 그대로 사전이라고 이해하시면 됩니다

dict = { "LinkC" :  "포풍놈팽이" }

라고 했을때, dict [ LinkC ] 를 하면 "포풍놈팽이"를 리턴하게 되는거죠

아무튼 위 기법을 적용해서 소스를 짜게 되면 ..



기발한 다른 경우도 굉장히 많군요


One line Solution 도 있네요


 



Posted by LinkC

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday19
Today4
Total331,875

달력

 « |  » 2019.9
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

최근에 받은 트랙백

글 보관함


. .