ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]1062: 가르침 - JAVA
    문제풀이/백준 2021. 4. 24. 15:08

    [백준]1062: 가르침

    www.acmicpc.net/problem/1062

     

    1062번: 가르침

    첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문

    www.acmicpc.net

    풀이

    백트래킹과 조합을 사용하여 풀었다.

     

    이 문제는 앞 뒤 'anta'와 'tica'에 속한 a,c,n,t,i 5개의 알파벳을 제외하고 k개의 알파벳을 추가로 학습하여 읽을 수 있는 단어의 최대 개수를 구하는 문제이다.

     

    알파벳을 뽑았는지 확인하기 위해 boolean타입의 visited배열을 선언해 주었고 이미 알고있는 a,c,n,t,i를 true로 설정해 주었다. 그리고 뽑은 알파벳들을 true로 바꾼 후 조건에 맞는 수의 알파벳을 다 뽑고 난 후 읽을 수 있는 단어의 개수를 계산해 주었다.

     

    이때 a,c,n,t,i가 이미 5개의 알파벳이므로 k가 5개 이하의 개수가 들어온다면 읽을 수 있는 단어의 개수가 없다.

    그리고 k가 26이 입력된다면 모든 알파벳을 읽을 수 있다는 의미이므로 n을 반환해 주면 된다.

     

    코드

    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
    68
    69
    import java.util.*;
     
    public class Main {
     
        static int n, k;
        static int max = Integer.MIN_VALUE;
        static boolean[] visited;
        static String[] word;
        
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
     
            n = scan.nextInt();
            k = scan.nextInt();
            
            scan.nextLine();
            word = new String[n];
            for(int i = 0; i < n; i++) {
                String str = scan.nextLine();
                str = str.replace("anta""");
                str = str.replace("tica""");
                word[i] = str;
            }
            
            if(k < 5) { //a c i n t의 개수가 5개이므로
                System.out.println("0");
                return;
            } else if(k == 26) { //모든 알파벳을 다 읽을 수 있다.
                System.out.println(n);
                return;
            }
            
            visited = new boolean[26]; //각 알파벳을 배웠는지 체크
            visited['a' - 'a'= true;
            visited['c' - 'a'= true;
            visited['i' - 'a'= true;
            visited['n' - 'a'= true;
            visited['t' - 'a'= true;
            
            backtracking(00);
            System.out.println(max);
        }
        
        public static void backtracking(int alpha, int len) {
            if(len == k - 5) {
                int count = 0;
                for(int i = 0; i < n; i++) { //뽑은 알파벳으로 몇개의 단어를 읽을 수 있는지 카운트.
                    boolean read = true;
                    for(int j = 0; j < word[i].length(); j++) {
                        if(!visited[word[i].charAt(j) - 'a']) {
                            read = false;
                            break;
                        }
                    }
                    if(read) count++;
                }
                max = Math.max(max, count);
                return;
            }
            
            for(int i = alpha; i < 26; i++) {
                if(visited[i] == false) {
                    visited[i] = true;
                    backtracking(i, len + 1);
                    visited[i] = false;
                }
            }
        }
    }
    cs

    '문제풀이 > 백준' 카테고리의 다른 글

    [백준]2096: 내려가기 - JAVA  (0) 2021.04.26
    [백준]15686: 치킨 배달 - JAVA  (0) 2021.04.25
    [백준]1339: 단어 수학 - JAVA  (0) 2021.04.24
    [백준]16929: Two Dots - JAVA  (0) 2021.04.21
    [백준]5430: AC - JAVA  (0) 2021.04.18

    댓글

Designed by Tistory.