๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/programmers

[programmers] ์™„์ „ํƒ์ƒ‰, ์†Œ์ˆ˜์ฐพ๊ธฐ

by dar0m! 2020. 1. 17.

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

 

๋ฌธ์ œ

0~9๋กœ ์ด๋ฃจ์–ด์ง„ ์ข…์ด ์กฐ๊ฐ์ด ์ฃผ์–ด์ง€๋ฉด, ์ข…์ด ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ข…์ด์กฐ๊ฐ์˜ ๊ฐœ์ˆ˜๋Š” 1~7 ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ

  1. ์ฃผ์–ด์ง„ ์ข…์ด์กฐ๊ฐ๋“ค๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž ์กฐํ•ฉ์„ ๋ฐฐ์—ด์— ๋ชจ๋‘ ์ €์žฅํ•ด๋‘”๋‹ค.
  2. ๋ฐฐ์—ด์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ˆซ์ž๋“ค ์ค‘ ๋˜‘๊ฐ™์€ ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด์ค€๋‹ค.
  3. ๋ฐฐ์—ด์„ ์ˆœํ™˜ํ•˜์—ฌ ์›์†Œ๊ฐ€ ์†Œ์ˆ˜์ด๋ฉด cnt ๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  4. cnt ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฐฐ์—ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฒ•

vector<int> v ๋ฅผ ์œ ์ผํ•œ ์›์†Œ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, 

  1. ์ •๋ ฌ์„ ํ•œ๋‹ค. : sort
  2. ์—ฐ์†๋œ ์ค‘๋ณต ์›์†Œ๋ฅผ vector์˜ ์ œ์ผ ๋’ท๋ถ€๋ถ„(์“ฐ๋ ˆ๊ธฐ ๊ฐ’)์œผ๋กœ ๋ณด๋‚ด๋ฒ„๋ฆฐ๋‹ค. : unique
  3. ์ค‘๋ณต๋œ ์›์†Œ๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ๋’ท๋ถ€๋ถ„์„ ์‚ญ์ œํ•œ๋‹ค : erase

unique ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜๊ฐ’์ด vector ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์˜ ์ฒซ๋ฒˆ์งธ ์œ„์น˜๊ฐ€ ๋˜๋ฏ€๋กœ ๋ฐ”๋กœ erase ํ•จ์ˆ˜ ์•ˆ์— ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
cs

 

์ฝ”๋“œ

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <cstdio>
#include <iostream>
#include <math.h>
#include <string>
#include <vector>
#include <algorithm>
#define MAX 10000005
using namespace std;
int prime[MAX], chk[MAX];
vector<int> v;
 
void prime_chk() {
    for (int i = 2; i <= sqrt(MAX); i++) {
        if (!prime[i]) {
            for (int j = i * 2; j <= MAX; j += i) {
                prime[j] = 1;
            }
        }
    }
}
 
void make_num(string numbers, string now, int len, int idx) {
    if (now.size() > 0) {
        v.push_back(stoi(now));
    }
    if (len == idx) return;
    
    for (int i = 0; i < numbers.size(); i++) {
        if (chk[i]) continue;
        chk[i] = 1;
        now.push_back(numbers[i]);
        make_num(numbers, now, len, idx+1);
        now.pop_back();
        chk[i] = 0;
    }
    return;
}
 
int solution(string numbers) {
    int cnt = 0;
    prime_chk();
    prime[0= prime[1= 1;
 
    // ์ˆซ์ž ๋งŒ๋“ค๊ธฐ
    string tmp;
    make_num(numbers, tmp, numbers.size(), 0);
 
    // ์ค‘๋ณต์ œ๊ฑฐ
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
 
    // ์†Œ์ˆ˜ํŒ๋ณ„
    for (int i = 0; i < v.size(); i++) {
        if (!prime[(v[i])]) cnt++;
    }
    return cnt;
}
 
using namespace std;
int main() {
    string numbers;
    cin >> numbers;
    
    printf("%d", solution(numbers));
    
    return 0;
}
cs

๋Œ“๊ธ€