티스토리 뷰
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 |
댓글