-
[백준]1339: 단어 수학 - JAVA문제풀이/백준 2021. 4. 24. 13:54
[백준]1339: 단어 수학
풀이
백트랙킹을 사용하여 풀었다. 먼저 알파벳을 리스트에 중복 없이 저장한 다음, 0부터 숫자를 하나씩 올리며 알파벳에 숫자를 할당(?)해 주었다.
리스트의 길이만큼 숫자를 다 뽑았다면 원래의 문자열과 비교하여 자리수에 맞게 숫자 연산을 하여 MAX값을 찾아주었다.
풀이 코드의 구조를 보면 전형적인 백트랙킹 순열 문제와 같다. 이번 문제에서 어려웠던 부분은 문자열을 자리수에 맞게 숫자 연산을 하는 부분이었다. 이 부분을 제외하면 그렇게 어렵지 않은 문제였당
코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960import 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