본문 바로가기

내일배움 캠프/TIL

2023 03 23 코딩 테스트 소수 찾기

문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 

붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 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를 통해 불필요한 게산을 줄였습니다