소수찾기
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한 사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
number | return |
"17" | 3 |
"011" | 2 |
Python 코드
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.append(int("".join(j))) num_list = set(num_list) # 중복과 0, 1 제외 if 0 in num_list : num_list.remove(0) if 1 in num_list : num_list.remove(1) # 소수 판별 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
* 참고 링크 : https://mentha2.tistory.com/8
C++ 코드
#include<string> #include<vector> #include<cmath> using namespace std; bool Visit[10000000]; bool Select[10]; int Answer; bool IsPrime(int N) { if (N == 0 || N == 1) return false; for (int i = 2; i <= sqrt(N); i++) { if (N % i == 0) return false; } return true; } void DFS(int Cnt, string S, string Res) { if(Res != "" && Visit[stoi(Res)] == false) { int Num = stoi(Res); Visit[Num] = true; if (IsPrime(Num) == true) Answer++; } for (int i = 0; i < S.length(); i++) { if (Select[i] == true) continue; Select[i] = true; DFS(Cnt + 1, S, Res + S[i]); Select[i] = false; } } int solution(string S) { DFS(0, S, ""); return Answer; }
* 참고 링크 : https://yabmoons.tistory.com/336
출처
'코딩테스트 > Programmers' 카테고리의 다른 글
[Leet Code] 162. Find Peak Element (0) | 2022.01.28 |
---|---|
[Leet Code] 374. Guess Number Higher or Lower (0) | 2022.01.28 |
[코딩테스트/Programmers] 24_모의고사 (Lv2.) (0) | 2022.01.23 |
[코딩테스트/Programmers] 23_주식가격 (Lv2.) (0) | 2022.01.18 |
[코딩테스트/Programmers] 22_기능개발 (Lv2.) (0) | 2022.01.17 |