728x90
반응형
https://www.acmicpc.net/problem/1062
정말 이문제는 이해를 못한 면도 컸지만 글에 담긴 정보가 많이 부족했던 것 같습니다.
이문제에서 가장 중요한 것은 a n t i c 5개의 문자는 무조건 배운 상태고 나머지에 대해서
K가 6이라면 K-5 이미배운 5개의 알파벳을 제외하고 나머지 알파벳에 21개에 대해서
K개만큼 뽑으면서 입력으로 들어옴 단어를 최대 몇 개 까지 읽을 수 있는지 출력하는 문제입니다.
이런 식으로 배운 문자 임을 체크했고 조합같이 26개 중 K-5개의 알파벳을 뽑아 입력된 단어를 몇 개 읽을지
확인하면 됩니다.
아래 소스를 보시고 이해해주세요.
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
|
#include<stdio.h>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
int N, K;
int Alphabet[26];
string input[52];
int Max = 0;
void dfs(int k, int idx) {
if (k == K - 5) {
int cnt = 0;
for (int i = 0; i < N; i++)
{
int cc = 0;
for (int j = 0; j < input[i].size(); j++) {
if (Alphabet[input[i][j] - 'a']) cc++;
else break;
}
if (cc == input[i].size())cnt++;
}
if (Max < cnt)Max = cnt;
return;
}
for (int i = idx; i < 26; i++) {
if (Alphabet[i] == 0) {
Alphabet[i] = 1;
dfs(k + 1, i + 1);
Alphabet[i] = 0;
}
}
}
int main(void)
{
scanf("%d %d", &N, &K);
for (int i = 0; i < N; i++) {
cin >> input[i];
input[i].erase(input[i].begin(), input[i].begin() + 4);
for (int j = 0; j < 4; j++) {
input[i].pop_back();
}
}
Alphabet['a' - 'a'] = Alphabet['n' - 'a'] = Alphabet['c' - 'a'] = Alphabet['i' - 'a'] = Alphabet['t' - 'a'] = 1;
dfs(0, 0);
printf("%d", Max);
return 0;
}
|
string 을 헤더 파일로 쓴다면 컴파일러는 C++14로 해야 런타임 오류가 안 생기니 잘 확인하시고 넣으세요
보기에는 간단히 풀은것 같지만 정말 힘겨웠던 문제 중 하나였던 것 같습니다.
감사합니다.
728x90
반응형
'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글
백준 16137 견우와 직녀 (0) | 2019.07.23 |
---|---|
백준 2309 일곱 난쟁이 (0) | 2019.07.21 |
백준 14391 종이 조각 (0) | 2019.07.21 |
백준 1748 수 이어 쓰기 1 (0) | 2019.07.17 |
백준 2669 직사각형 네개의 합집합의 면적 구하기 (0) | 2019.07.16 |
댓글