일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Greedy
- mysql
- Docker
- ios
- sigmoid
- BFS
- 프로그래머스
- 부르트포스
- 그래프
- C++
- Swift
- dfs
- dp
- Stack
- 그리디
- DeepLearning
- 백트래킹
- 플로이드와샬
- NeuralNetwork
- 문제풀이
- Algorithm
- 실버쥐
- 알고리즘
- ReLU
- 풀이
- Blockchain
- 백준
- 탐색
- 캡스톤정리
- Node.js
- Today
- Total
개발아 담하자
[프로그래머스/C++] 소수 찾기 풀이 본문
프로그래머스 : 소수 찾기
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42839
문제
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
numbers는 길이 1 이상 7 이하인 문자열입니다.
numbers는 0~9까지 숫자만으로 이루어져 있습니다.
013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다
이 문제를 풀어보기 전에 백준 - 소수 구하기 문제를 풀어보면 좋다.
https://www.acmicpc.net/problem/1929
이 문제는 아리스토테네스의 체 를 사용해서 풀어야 하는 문제다.
아리스토테네스의 체란? 👇
https://silver-g-0114.tistory.com/39?category=1094593
먼저 입력된 numbers 를 내림차순 정렬해 numbers를 조합해 만들 수 있는 가장 큰 수를 만든 후 2부터 가장 큰 수 까지 차례대로 소수인지 아닌지 검사한다. (에라토스테네스의 체 를 사용)
이 때 checknumbers 메소드로 입력된 numbers 로 만들 수 있는 소수인지 검사한다.
일의 자리부터 탐색을 시작해서 visit배열로 사용한 수인지 아닌지 검사한다.
간단해 보이지만 제대로 이해하는 데 정말 오랜 시간이 걸렸다 ㅠㅠ
풀이
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool checknumber(int i, string numbers){ // i가 numbers로 만들 수 있는 소수인지 판별
bool flag = false;
vector<bool> visit(numbers.length());
while(i != 0){
flag = false;
int tmp = i%10; // 일의 자리부터 탐색 시작
for(int j=0; j<=numbers.length(); j++){
if(tmp==numbers[j]-'0' && visit[j]==0){ // numbers의 숫자인지 판단 && 방문 판단
flag = true;
visit[j] = 1;
break;
}
}
if(flag==false){
return false;
}
i /= 10;
}
return true;
}
int solution(string numbers) {
int answer = 0;
// 내림차순 -> numbers 의 큰 수 만듦 (2~71) 소수 찾기
sort(numbers.begin(), numbers.end(), greater<int>());
vector<bool> tmp(stoi(numbers)+1);
for(int i=2; i<=stoi(numbers); i++){
if(tmp[i] == false && checknumber(i, numbers)){
answer++;
}
if(tmp[i] == false){ // i의 배수는 모두 소수가 아님을 표시
for(int j=i; j<=stoi(numbers); j+=i){
tmp[j] = true;
}
}
}
return answer;
}
풀이 인증
'👩💻 알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] 올바른 괄호 풀이 (0) | 2020.03.17 |
---|---|
[프로그래머스/C++] N개의 최소공배수 풀이 (0) | 2020.03.17 |
[프로그래머스/C++] 서머코딩/윈터코딩(2019) 멀쩡한 사각형 풀이 (0) | 2020.03.11 |
[프로그래머스/C++] 2017 카카오 예선 : 카카오프렌즈 컬러링북 풀이 (0) | 2020.02.07 |
[프로그래머스/C++] 큰 수 만들기 풀이 (1) | 2020.01.24 |