알고리즘/프로그래머스(C++)
[프로그래머스/알고리즘] 소수 찾기
chaibin
2019. 1. 13. 23:54
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다.
흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
해결 방법
문자열 변수인 string은 sort함수를 사용할 수 있습니다.
내림차순을 이용하면 number는 가장 큰 수를 만들어 낼 수 있습니다.
예로들면 "17"은 71로 변하기 떄문에 2~71까지 비교해서 해당 조각에 만족하는 소수를 찾아내면 됩니다.
number는 기본적으로 문자열로 되어있기 때문에 정수로 변하려면 stoi함수를 이용했고
71을 구했으면 2~71까지 비교하는데 7이나 1을 사용했는지 안했는지 확인하는 visit 배열을 이용해서 계산 했습니다.
소스 코드
#include <string> #include <vector> #include <algorithm> #include <functional> using namespace std; bool checkNumber(int i, string numbers); int solution(string numbers) { int answer = 0; sort(numbers.begin(), numbers.end(), greater<int>()); vector<bool> temp(stoi(numbers)+1); for (int i = 2; i <= stoi(numbers); i++) { if (temp[i]==false && checkNumber(i,numbers)) { answer++; } if (temp[i] == false) { for (int j = i; j <= stoi(numbers); j += i) { temp[j] = true; } } } return answer; } bool checkNumber(int i,string numbers) { bool flag = false; vector<bool> visit(numbers.length()); while (i != 0) { flag = false; int temp = i % 10; for (int j = 0; j <= numbers.length(); j++) { if (temp == numbers[j]-'0'&&visit[j]==0) { flag = true; visit[j] = 1; break; } } if (flag == false) return false; i /= 10; } return true; }