DOTY

22) 프로그래머스 Lv2 - 소수 찾기 본문

Algorithm/BFS&DFS

22) 프로그래머스 Lv2 - 소수 찾기

증식세포 2023. 6. 1. 17:29
728x90
반응형

코딩테스트 연습 - 소수 찾기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


예외를 생각 못해서 오래 걸린 문제.

#include <bits/stdc++.h>

using namespace std;

int check_primNum[10000000] = {0, };
int check[7] = {0, };
string nums;
int answer = 0;
unordered_set<int> s;

void do_primNum(int N) {
    check_primNum[0] = 1;
    check_primNum[1] = 1;
    for(int i = 2; i < N; i++) {
        if(check_primNum[i] == 1) continue;
        for(int j = i+i; j < N; j += i) {
            check_primNum[j] = 1;
        }
    }
}

void make_numbers(string si_number, int cnt) {
    if(cnt != 0) {
        s.insert(stoi(si_number));
    }
    if(cnt == nums.length()) {
        return;
    }
    for(int i = 0; i < nums.length(); i++) {
        if(!check[i]) {
            check[i] = 1;
            si_number += nums[i];
            make_numbers(si_number, cnt+1);
            si_number.pop_back();
            check[i] = 0;
        }
    }
}

int solution(string numbers) {
    nums = numbers;
    do_primNum(pow(10, nums.length()));
    string si_number = "";
    make_numbers(si_number, 0);
    unordered_set<int>::iterator iter;
    for(iter = s.begin(); iter != s.end(); iter++) {
        if(check_primNum[*iter] == 0) {
            answer++;
        }
    }
    return answer;
}

1. "에라토스테네스의 체"를 활용해서 조건에 만족하는 가장 큰 값인 "9999999"까지의 수 중에 소수를 우선 걸러낸다.

2. 종이로 만들 수 있는 모든 수를 찾는다.

(여기서 실수 했던 점 : string si_number == "" 일 때 stoi(si_number)하면 core dump가 일어날 수 있다.)

3. 수 들을 전부 set에 넣고 마지막에 걸러낸 소수배열과 비교해서 답을 구한다.

 

구현 자체는 어렵다고 못느꼈지만 하나의 실수 때문에 시간을 너무 허비한 문제였다.

728x90
반응형

'Algorithm > BFS&DFS' 카테고리의 다른 글

21) 백준 2151 - 거울 설치  (0) 2023.05.26
20) 백준 2206 - 벽 부수고 이동하기  (0) 2023.05.02
19) 백준 9663 - N-Queen  (1) 2023.04.22
18) 백준 1707 - 이분 그래프  (0) 2023.04.13
17) 백준 2665 - 미로만들기  (0) 2023.04.12