프로그래머스 - 완전탐색(모의고사, 소수찾기, 카펫)
업데이트:
문제 링크 - https://programmers.co.kr/learn/courses/30/parts/12230
👀문제이해 및 풀이방법
완전탐색 문제 사실상 구현문제라고 봐도 무방하다.
2번 문제인 소수찾기 문제가 조금 까다로웠는데 조금 중복이 있더라도 permutation함수를 사용해서 풀었다.
숫자들의 목록으로 만들수있는 모든 숫자들을 다 체크하는게 쉬운일은 아니였다
prime_table의 경우 자주 쓰이므로 계속 리마인드 하는게좋을것 같다
3번문제인 카펫은 그냥 흘러가는데로 짜봤는데 엄청 짧게 잘 풀린것 같다
📝코드
1 모의고사
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> answers) {
int x=0,y=0,z=0;
for(int i=0;i<answers.size();i++){
if(answers[i]==(i)%5+1)
x++;
if(i%2==0 && answers[i]==2)
y++;
else if(i%2==1){
int tmp= (i/2)%4;
if(tmp==0&& answers[i]==1)
y++;
else if(tmp!=0 && answers[i]==tmp+2)
y++;
}
int t =(i/2)%5;
if(t==0 && answers[i]==3)
z++;
else if(t==1 && answers[i]==1)
z++;
else if(t==2 && answers[i]==2)
z++;
else if(t==3 ||t==4){
if(answers[i]==t+1)
z++;
}
}
vector<int> answer;
int sol=max(max(x,y),z);
if(x==sol)
answer.push_back(1);
if(y==sol)
answer.push_back(2);
if(z==sol)
answer.push_back(3);
return answer;
}
2 소수 찾기
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
class prime_num{
private:
vector<bool> prime_table;
string numbers;
int size;
public:
prime_num(string& n):numbers(n){
size = (int)pow(10,numbers.size());
prime_table.resize(size,true);
prime_table[0]=false;
prime_table[1]=false;
for(int i=2;i<size;i++){
if(prime_table[i]){
for(int j=2;j<=(size-1)/i;j++)
prime_table[i*j]=false;
}
}
}
int fins_sol(){
int sol=0,tmp;
for(int i=1;i<=numbers.size();i++){
sort(numbers.begin(),numbers.end());
do{
tmp=stoi(numbers.substr(0,i));
if(prime_table[tmp]){
prime_table[tmp]=false;
sol++;
}
}while(next_permutation(numbers.begin(),numbers.end()));
}
return sol;
}
};
int solution(string numbers) {
prime_num pn(numbers);
return pn.fins_sol();
}
3 카팻
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int brown, int yellow) {
for(int i=3;i<brown/2;i++){
if((brown-i*2)/2*(i-2)==yellow)
return {(brown+yellow)/i,i};
}
}
댓글남기기