일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코딩인터뷰
- 데이터유통
- 동시성
- clean code
- 실전사례
- Raw-Request-URI
- 회고
- 클린코드
- spray
- 테스트주도개발
- 2016년회고
- 켄트백
- 박종천
- 개발자로살아남기
- functional thinking
- datalake
- 2017회고
- 개발7년차매니저1일차
- 개발자
- 단위테스트
- kafka
- 데이터레이크
- wait region split
- hackercup2017
- 알고스팟
- 데이터플랫폼
- 해커컵
- 함수형 사고
- 데이터야놀자
- coursera
Archives
- Today
- Total
Software Engineering Note
개미수열 본문
지나가다 본 문제인데 호기심이 생겨 풀어보았다.
문제는 다음과 같다.
개미수열? http://navercast.naver.com/contents.nhn?rid=22&contents_id=2322
출처 : https://www.facebook.com/photo.php?fbid=718742614882121&set=gm.870169196356951&type=1
'읽고 말하기 수열' 이라고 부르는 것같은데 바로 위에 있는 수가 몇 개인지 쭈-욱 나열하는 것이다.
1
11 (1이 1개)
12 (1이 2개)
1121 (1이 1개 2가 1개)
...
C, Python, Java로 각각 풀어보았다.
1. C (재귀)
#include <stdio.h> #include <string.h> const int MAX_DEPTH = 10; int getLength(char *pChar) { char ch = *pChar; int count = 0; while(*pChar && *pChar == ch) { count++; pChar++; } return count; } void solve(char *pChar, int depth) { printf("%s\n", pChar); if (depth >= MAX_DEPTH) return ; char output[64]; memset(output, 0, sizeof(output)); while(*pChar) { int len = getLength(pChar); sprintf(output, "%s%c%d", output, *pChar, len); pChar += len; } solve(output, depth+1); } int main() { solve("1", 0); return 0; }
2. Python (루프)
MAX_LOOP = 10 def get_length(num_str): first_char = num_str[0] for i in range(0, len(num_str)): if num_str[i] != first_char: return i return len(num_str) def solve(num_str): new_str = "" start_pos = 0 while start_pos < len(num_str): length = get_length(num_str[start_pos:]) new_str += num_str[start_pos] + str(length) start_pos += length return new_str if __name__ == '__main__': num_str = "1" for i in range(MAX_LOOP): print str(i) + ": " + num_str num_str = solve(num_str)
3. Java
public class MorrisGenerator { private final String PARTITION_MARK = " "; public void generate(int limit) { String str = "1"; for(int i = 0; i < limit; i++) { System.out.println(str); str = makeMorrisNumber(makePartitionedStr(str).split(PARTITION_MARK)); } } private String makeMorrisNumber(String[] strs) { String morris = ""; for(String s : strs) { morris += (s.charAt(0) + String.valueOf(s.length())); } return morris; } private String makePartitionedStr(String str) { String newStr = ""; char bChar = str.charAt(0); for(int i = 0; i < str.length(); i++) { char nChar = str.charAt(i); if (bChar != nChar) { newStr += PARTITION_MARK; } bChar = nChar; newStr += nChar; } return newStr; } public static void main(String[] args) { MorrisGenerator mg = new MorrisGenerator(); mg.generate(10); } }
그리고, 이런 풀이도 .. ^^;
붙여놓으면 다음과 같다. 입력이 반복 수가 아닌 문자열 길이라는게 차이점
import itertools def next_morris(number): return ''.join('%s%s' % (digit, len(list(group))) for digit, group in itertools.groupby(str(number))) def morris_generator(maxlen, start=1): num = str(start) while len(num) < maxlen: yield int(num) num = next_morris(num) for n in morris_generator(10): print n