문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을
붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때,
종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
numbers는 길이 1 이상 7 이하인 문자열입니다.
numbers는 0~9까지 숫자만으로 이루어져 있습니다.
"013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers | return |
"17" | 3 |
"011" | 2 |
코드 구현
number= [n for n in numbers]
perm=[]
arr=[]
for cnt in range(1,len(number)+1):
for i in permutations(number,cnt):
#permutations() 를 이용해서 조합을 생성
perm.append(i)
for j in perm:
arr.append(int((''.join(j))))
#perm 에 저장되어있는 값을 ''로 조인을 하고 int값으로 변경
arr = list(set(arr))
이 코드를 통해 numbers로 만들수있는 조합들을 만들고나서 중복을 제거하는
코드를 구현하였으나 이 코드를 줄일 수 있는 방법을 생각하다가
number= [n for n in numbers]
arr=[]
for cnt in range(1,len(number)+1):
arr += list(map(int, map(''.join, permutations(number,cnt))))
arr = set(list(arr))
map을 이용해서 불필요한 부분을 쳐낼수 있었습니다
그후에 정수형으로 정리된 리스트를 하나하나 비교해서
소수인지 아닌지 판단을 하는 코드를 구현하기 위해
sqrn(n)을 이용해서 해결해보기 위해서 노력했습니다..
for prime in arr:
for div in range(2,int(prime**0.5)):
if prime == 0 or prime == 1:
pass
else:
if prime % div != 0:
answer += 1
break
이 코드에서 자꾸 오류가 발생해서 처음에는 count+=1 을 줘서 count>1 일시
answer+=1을해서 answer의 값을 출력하려고 했지만
자꾸 오류가 발생해서 아예 처음부터 하나하나 짜보았습니다
for prime in arr:
count = True
for div in range(2,int(prime**0.5)+1):
if prime % div ==0 :
count=False
break
if prime>1 and count:
answer+=1
다시 코드를 작성하면서 range의 범위 조절에 실수가 있다는걸 깨닫고
int(prime**0.5)+1을 통해서 범위를 내가 원하는 값으로 조정을 할수있었고
주어진 값인 prime과 2부터 prime의 제곱근까지의 범위중에서
%연산을 했을때 나머지가 0인 경우가있으면 count에 False를 주고
break를 통해 불필요한 게산을 줄였습니다
'내일배움 캠프 > TIL' 카테고리의 다른 글
2023 03 27 파이썬 터미널 RPG 만들기 (0) | 2023.03.29 |
---|---|
2023 03 24 재귀 함수를 이용해서 복리 구하기 (0) | 2023.03.24 |
2023 03 22 코딩 테스트를 하면서 새로 배운것들... (0) | 2023.03.22 |
2023 03 21 자연수 뒤집어 배열로 만들기 (0) | 2023.03.22 |
2023 03 20 모의고사 코드테스트 (0) | 2023.03.20 |