[백준 18856] 피드백 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
문제의 조건에 맞는 수열을 생성하는 문제입니다.
생성해야 하는 수열의 조건들은 다음과 같습니다.
- 수열의 크기는
n
입니다. - 수열의 각 항은 이전 항보다 커야 합니다.
- 수열의 각 항은
1
과1,000
사이의 정수 입니다. - 수열의 두 번째 항은 반드시
2
입니다. - 수열의 마지막 항은 반드시
소수
여야 합니다.
입력받은 n
에 대하여, 수열의 두 번째 항이 2
이므로, 조건에 따라서 첫 번째 항은 반드시 1
이 될 것입니다.
이후, 세 번째 항부터 n - 1
번째 항 까지는, 단순히 이전 항 보다 큰 아무 수를 선택할 수 있습니다.
다만, 선택 가능한 수의 범위는 3
부터 1,000
까지 입니다.
마지막으로, n
번째 항은 n - 1
번째 항의 수보다 큰 소수를 선택하면 됩니다.
소수를 구하기 위해서는 에라토스테네스의 체 를 활용하였습니다.
에라토스테네스의 체 에 관련해서는 여기 에서 확인하실 수 있습니다.
Code
[ C# ]
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
namespace Solution {
class Program {
static List<int> GeneratePrimeNums(int maxNum) {
var isPrime = Enumerable.Repeat(true, maxNum + 1).ToArray();
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= maxNum; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= maxNum; j += i)
isPrime[j] = false;
}
}
var primes = new List<int>();
for (int i = 2; i <= maxNum; i++) {
if (isPrime[i]) primes.Add(i);
}
return primes;
}
static void Main(string[] args) {
var n = int.Parse(Console.ReadLine()!);
var primes = GeneratePrimeNums(1_000);
Console.WriteLine(n);
Console.Write("1 2 ");
int ele = 2;
for (int i = 3; i < n; i++) {
ele++;
Console.Write($"{ele} ");
}
foreach (var prime in primes) {
if (prime > ele) {
Console.WriteLine(prime);
break ;
}
}
}
}
}
[ C++ ]
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
#include <bits/stdc++.h>
using namespace std;
vector<int> generatePrimeNums(const int& maxNum) {
vector<bool> isPrime(maxNum + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= maxNum; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= maxNum; j += i)
isPrime[j] = false;
}
}
vector<int> primes;
for (int i = 2; i <= maxNum; i++) {
if (isPrime[i]) primes.push_back(i);
}
return primes;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
vector<int> primes = generatePrimeNums(1'000);
cout << n << "\n";
cout << "1 2 ";
int ele = 2;
for (int i = 3; i < n; i++) {
ele++;
cout << ele << " ";
}
for (int prime : primes) {
if (prime > ele) {
cout << prime << "\n";
break ;
}
}
return 0;
}