티스토리 뷰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
numbers=[0,1,2,3,4,5,6,7,8,9]
answer=''
count_result=0
for i in range(0,len(numbers)):
    index=0
    count=1
    for j in range(1,len(numbers)):
        count=count*j
    for k in range(1,len(numbers)):
        if(count_result+count<1000000):
            count_result=count_result+count
            index=index+1
    answer=answer+(str)(numbers[index])
    numbers.remove(numbers[index])
print(answer)
#반환 시간 : 0
cs




2페이지에 이 문제를 포함해서 네 문제가 남았는데


문제가 쉽지 않아서 오래오래 생각하며 삽질하는 도중에


좋은 알고리즘이 나온 것 같다.



먼저 numbers 리스트에 0부터 9까지 오름차순으로 넣어 두고 그 요소의 수만큼 반복문을 도는데


그 안에서 각 자리수에 대한 순열의 경우의 수를 구하고


경우의 수가 백만이 넘어가기 전에 인덱스와 총 경우의 수를 저장하고


다음 자리수로 넘어가서 또다시 그 자리수에 대한 순열의 경우의 수를 구하는 것을 반복하였다.



remove()를 이용하여 비복원 추출을 하는 것이 포인트인 것 같다.



이전에 삽질하던 코드는


각 자리수에 난수로 인덱스를 생성하여 각 자리마다 겹치지 않게 한 후


리스트에 넣어 새로 만든 값이 리스트에 있는지 검사하여 리스트를 채워나가는 식이었는데


이렇게 하면 시간이 말도 안되게 오래 걸리므로 좋지 않았다.



계속 생각하다 보면 어쨌든 더 좋은 방법이 나온다.

'Algorithm > Project Euler' 카테고리의 다른 글

프로젝트 오일러 53번  (0) 2017.07.06
프로젝트 오일러 49번  (0) 2017.07.05
프로젝트 오일러 35번  (0) 2017.07.04
프로젝트 오일러 28번  (0) 2017.07.04
프로젝트 오일러 56번  (0) 2017.07.03
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함