백준 1062 가르침
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 1062 가르침

by KyeongMin 2019. 7. 21.
728x90
반응형

https://www.acmicpc.net/problem/1062

 

1062번: 가르침

첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문자로만 이루어져 있고, 길이가 8보다 크거나 같고, 15보다 작거나 같다. 모든 단어는 중복되지 않는다.

www.acmicpc.net

정말 이문제는 이해를 못한 면도 컸지만 글에 담긴 정보가 많이 부족했던 것 같습니다.

이문제에서 가장 중요한 것은 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(00);
    printf("%d", Max);
    return 0;
}
 
 

string 을 헤더 파일로 쓴다면 컴파일러는 C++14로 해야 런타임 오류가 안 생기니 잘 확인하시고 넣으세요

보기에는 간단히 풀은것 같지만 정말 힘겨웠던 문제 중 하나였던 것 같습니다. 

감사합니다.

728x90
반응형

댓글