ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]1339: 단어 수학 - JAVA
    문제풀이/백준 2021. 4. 24. 13:54

    [백준]1339: 단어 수학

    www.acmicpc.net/problem/1339

     

    1339번: 단어 수학

    첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

    www.acmicpc.net

    풀이

    백트랙킹을 사용하여 풀었다. 먼저 알파벳을 리스트에 중복 없이 저장한 다음, 0부터 숫자를 하나씩 올리며 알파벳에 숫자를 할당(?)해 주었다.

     

    리스트의 길이만큼 숫자를 다 뽑았다면 원래의 문자열과 비교하여 자리수에 맞게 숫자 연산을 하여 MAX값을 찾아주었다.

     

    풀이 코드의 구조를 보면 전형적인 백트랙킹 순열 문제와 같다. 이번 문제에서 어려웠던 부분은 문자열을 자리수에 맞게 숫자 연산을 하는 부분이었다. 이 부분을 제외하면 그렇게 어렵지 않은 문제였당

     

    코드

    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
    import java.util.*;
     
    public class Main {
        
        static int n;
        static int max = Integer.MIN_VALUE;
        static ArrayList<Character> list;
        static String[] word;
        static boolean[] visited;
        static int[] value;
        
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
     
            n = scan.nextInt();
            list = new ArrayList<>();
            word = new String[n];
            
            scan.nextLine();
            for(int i = 0; i < n; i++) {
                word[i] = scan.nextLine();
                for(int j = 0; j < word[i].length(); j++) {
                    if(!list.contains(word[i].charAt(j))) list.add(word[i].charAt(j));
                }
            }
            
            visited = new boolean[10];
            value = new int[list.size()];
            
            backtracking(0);
            System.out.println(max);
        }
        
        public static void backtracking(int len) {
            if(len == list.size()) {
                int sum = 0;
                for(int i = 0; i < n; i++) {
                    int num = 0;
                    for(int j = 0; j < word[i].length(); j++) {
                        num *= 10;
                        num += value[list.indexOf(word[i].charAt(j))];
                    }
                    sum += num;
                }
                max = Math.max(max, sum);
                return;
            }
            
            for(int i = 0; i <= 9; i++) {
                if(visited[i] == false) {
                    visited[i] = true;
                    value[len] = i;
                    backtracking(len + 1);
                    visited[i] = false;
                    value[len] = 0;
                }
            }
        }
    }
     
    cs

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

    [백준]15686: 치킨 배달 - JAVA  (0) 2021.04.25
    [백준]1062: 가르침 - JAVA  (0) 2021.04.24
    [백준]16929: Two Dots - JAVA  (0) 2021.04.21
    [백준]5430: AC - JAVA  (0) 2021.04.18
    [백준]3109: 빵집 - JAVA  (0) 2021.04.17

    댓글

Designed by Tistory.