문제
풀이
처음 이 문제를 봤을때 손도 못댔었는데 정답 코드를 보니 조금 허무했습니다.
이런게 애드혹이겠죠.. ㅠ
우선 N의 범위가 10^7이기 때문에 범위 내에서는 8종류의 수까지 표현할 수 있습니다.
따라서 K가 9, 10인 경우에는 9, 10종류의 수를 사용한 가장 작은수를 출력하면 그게 답입니다.
K = 9일 때는102345678이 되겠고, K = 10일 때는 1023456789가 되겠습니다.
그러면 나머지의 경우는 많아봐야 1천만 정도라서 N을 1씩 증가시키면서 직접 비교해도 시간 안에 문제를 해결할 수 있습니다.
저는 N + 1을 문자열로 만들어서 각 자리를 카운팅한 다음 카운팅한 갯수가 정확이 K개인지 확인하는 방식으로 구현했습니다.
N + 1을 계속 하기때문에 무조건 N보다는 큰 숫자일 수밖에 없고, 그 수가 정확이 K개의 숫자만 사용했다면 그게 정답이 됩니다.
코드
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
|
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string str;
int K;
bool chk[10];
void func() {
if (K == 10) {
cout << "1023456789\n";
return;
}
if (K == 9) {
cout << "102345678\n";
return;
}
while (1) {
str = to_string(stoi(str) + 1);
int cnt = 0;
for (auto x : str) {
if (chk[x - '0']) continue;
cnt++;
chk[x - '0'] = true;
}
if (cnt == K) {
cout << str << '\n';
return;
}
memset(chk, false, sizeof(chk));
}
}
void input() {
cin >> str >> K;
}
int main() {
cin.tie(NULL); cout.tie(NULL);
ios::sync_with_stdio(false);
input();
func();
return 0;
}
|
cs |
'대회 > elice' 카테고리의 다른 글
엘리스 코드 챌린지 Day 9 격자 위의 ELICE (0) | 2024.07.24 |
---|---|
엘리스 코드 챌린지 Day 8 강림제 (0) | 2024.07.23 |
엘리스 코드 챌린지 Day 6 빨간 선과 파란 선 (0) | 2024.07.23 |
엘리스 코드 챌린지 Day 5 수열 복원 (0) | 2024.07.22 |
엘리스 코드 챌린지 Day 4 트리 위의 게임 (0) | 2024.07.22 |