문제링크
https://programmers.co.kr/learn/courses/30/lessons/42839?language=python3
아래 2가지 과정으로 문제를 단순화 해서 풀었음
1. 전체 순열리스트 구하기
2. 소수 판별
위 2개만 보면 아주 간단해 보이는데, 저 2개 구현하는게 생각보다 간단하지 않아서
문제푸는데 오래걸렸음.
- 전체 순열리스트 구하기는 itertools의 permutations를 사용해서 구함
- 소수판별은 에라토스테네스의 체 방식으로
* 판별하려는 수(이하 판별수)를 2부터 판별수의 제곱근으로 나누어 나머지가 0인 경우가 나오면 소수가 아님
permutations를 사용안하면 문제푸는데 상당히 오래걸릴 듯 싶다.
아래는 코드
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
|
from itertools import permutations
def solution(numbers):
# 소수 판별할 리스트 만들기
num_list = [] # 전체 순열 넣어줄 리스트
for i in range(1,len(numbers)+1) :
test_list = permutations(numbers,i)
for j in test_list :
num_list = set(num_list) # 중복과 0, 1 제외
if 0 in num_list :
if 1 in num_list :
# 소수 판별
answer = len(num_list) # 모든 수가 소수라 가정하고 시작
for i in num_list :
if i != 2 :
for j in range(2,int(i**0.5)+1) :
if i % j== 0 :
answer -=1
break
return answer
|
+ itertools.permutations 사용안한 다른사람 코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
# 0으로 시작하는 숫자.
# 모든 숫자의 조합.
def isPrimeNumber(number):
if number <= 1:
return False
else:
for i in range(2, number // 2 + 1):
if number % i == 0:
return False
return True
def getAllCombination(numbers, numList, leftCipher):
'''
numbers : 총 숫자카드 list
numList : 가능한 숫자 배열 list
leftCipher : 남은 자릿수
'''
# 현재 가능한 숫자 배열 list를 기준으로 추가가 가능한 숫자들은 찾는다.
newNumList = [[]]
for li in numList:
for i in numbers:
tmp = li[:]
if i not in li:
tmp = li[:]
leftCipher -= 1
if leftCipher == 0:
return newNumList
else:
return getAllCombination(numbers, newNumList, leftCipher)
def removeFirstZero(numList):
for i, num in enumerate(numList):
firstNumIsZero = bool()
while True:
if len(num) >= 2 and num[0] == '0':
firstNumIsZero = True
else:
numList[i] = num
break
num = num[1:]
def getUnique2DList(numList):
for i, val in enumerate(numList):
tmp = str()
for char in val:
tmp += char
numList[i] = tmp
newList = list(set(numList))
return newList
def solution(numbers):
availableAnswer = getAllCombination(numbers, [[]], len(numbers))
del availableAnswer[0]
removeFirstZero(availableAnswer)
availableAnswer = getUnique2DList(availableAnswer)
answer = 0
for val in availableAnswer:
if isPrimeNumber(int(val)):
print(val)
answer += 1
return answer
|
[알고리즘 풀이] 프로그래머스 : 타겟넘버, Level2(깊이/너비 우선 탐색) (0) | 2019.04.12 |
---|---|
[알고리즘 풀이] 프로그래머스 : 가장 큰 수, Level2(정렬) (0) | 2019.04.12 |
[알고리즘 풀이] 프로그래머스 : 체육복, Level2(탐욕법) (0) | 2019.04.12 |
[알고리즘 풀이] 프로그래머스 : K번째수, Level1(정렬) (0) | 2019.04.12 |
[알고리즘 풀이] 프로그래머스 : 더 맵게, Level2(Heap) (0) | 2019.04.12 |