-
프로그래머스 - 소수 찾기알고리즘 풀이/프로그래머스 2019. 11. 13. 20:55
문제 : https://programmers.co.kr/learn/courses/30/lessons/42839
코딩테스트 연습 - 소수 찾기 | 프로그래머스
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. 013은 0, 1, 3 숫자가 적힌 종이
programmers.co.kr
풀이 :
picked 배열은 numbers의 1부터 numbers의 길이까지 숫자들을 쪼개서 넣게 된다.
예를 들면 17을 넣게 되면 1 / 7 / 1,7 / 7,1을 담게 된다.
이제 각 후보들을 구했다면 이 후보들 중 소수를 찾자. 중복된 수가 나 올 수 있기에 set을 통해 중복
을 없애주자.
코드(C++)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <string> #include <vector> #include <iostream> #include <set> using namespace std; bool visited[8]; int ret = 0; set<int> ss; void solve(int n, vector<char>& picked, vector<char>& v) { if (picked.size() == n) { string temp = ""; for (int i = 0; i < picked.size(); ++i) { temp += picked[i]; } int ans = stoi(temp); bool check = true; if (ans == 1 || ans == 0) return; for (int i = 2; i < ans; ++i) { if (ans%i == 0) { check = false; break; } } if (check) { if (ss.find(ans) != ss.end()) return; ret++; ss.insert(ans); } return; } for (int i = 0; i < v.size(); ++i) { if (visited[i]) continue; picked.push_back(v[i]); visited[i] = true; solve(n, picked, v); picked.pop_back(); visited[i] = false; } } int solution(string numbers) { int answer = 0; vector<char> v; for (int i = 0; i < numbers.size(); ++i) { v.push_back(numbers[i]); } vector<char> picked; for (int i = 1; i <= numbers.size(); ++i) { solve(i, picked, v); } return ret; } '알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 전화번호 목록 (0) 2019.11.21 프로그래머스 - 네트워크 (0) 2019.11.13 프로그래머스 - 더 맵게 (0) 2019.11.13 프로그래머스 - K번째수 (0) 2019.11.07 프로그래머스 - 완주하지 못한 선수 (0) 2019.11.06