[pythonchallenge] 10번 문제 풀이
💡 pythonchallenge.com 10번 문제에 대한 풀이입니다.
- Link : http://www.pythonchallenge.com/pc/return/bull.html
- id: huge
- pw: file
문제
화면 하단의 힌트를 보면 len(a[30])
이 얼마인지 묻고 있습니다.
소를 클릭하면 다음과 같이 수열의 형태가 나옵니다.
이번 문제는 해당 수열의 a[30] 원소를 구한다음 길이를 구하는 문제라고 추측됩니다.
문제 풀이
우선 바로 풀어도 되지만, 수열 같은건 구글에 검색하면 바로 답이 나오기 때문에 ^^… 구글의 힘을 얻어봅니다.
해당 수열은 읽고 말하기 수열이라고 합니다. 그리고 위키에 들어가서, 확인해본 결과 규칙을 알 수 있었습니다.
해당 수열은 다음과 같이 생성됩니다.
1 -> 1개의 1 (11)
11 -> 2개의 1 (21)
21 -> 1개의 2, 1개의 1 (1211)
1211 -> 1개의 1, 1개의 2, 2개의 1 (111221)
111221 -> 3개의 1, 2개의 2, 1개의 1 (312211)
…
이제 로직을 알았으니, 해당 로직을 바탕으로 수열을 생성하는 파이썬 코드를 작성합니다. 코드는 아래에 있습니다.
코드 실행결과 a[30]의 길이는 5808 입니다.
전체 코드
def ls_sequence(n):
sequence = [1]
r = 0 # rotate
while r < n-1:
string = str(sequence[r])
idx = 0
result = ''
while idx < len(string):
# idx가 가장 마지막인 경우 비교할 대상 없이 끝낸다.
if(idx) == len(string)-1:
result = result + str(1) + string[idx]
break
# 먼저 현재 인덱스와 같은 숫자의 개수 구한다.
count = 1
while string[idx] == string[idx + 1]:
count += 1
idx +=1
if(idx == len(string)-1):
break
# 갯수 먼저 쓰고, 뒤에 숫자 쓴다.
result = result + (str(count) + string[idx])
idx +=1
sequence.append(int(result))
r = r+1
return sequence
print(len(str(ls_sequence(31)[-1])))
#5808
댓글남기기