백준 문제풀이

[백준 1339] - 단어 수학(JAVA)

쿠쿠s 2021. 12. 27. 16:18

[문제]

출처 - https://www.acmicpc.net/problem/1339

 

1339번: 단어 수학

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

www.acmicpc.net

 


[문제 풀이]

  • 최댓값을 찾는 문제이므로. 입력으로 받은 단어의 자릿수를 만들고 각 단어의 합을 구하여 높은 값부터 대입해준다.
    •  EX) ABC + DEF  = 100A + 10B + 1C + 100D+ 10E + 1F = 100A + 100D + 10B + 10E + 1C + 1F
    •  => 100A + 100D + 10B + 10E + 1C + 1F
    •  => A = 9 , D = 8 , B = 7 , E = 6, C = 5,  F = 4
    •  => 1839
  • 위의 과정을 코드로 구현을 하면 풀 수 있다. 자세한 건 아래 소스 코드와 주석을 함께 참고하면 된다.

 


[소스 코드]

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		Integer[] alpha = new Integer[26]; //알파벳수만큼 배열 선언

		Arrays.fill(alpha, 0);
		
		for(int i=0; i<n; i++) {
			char input[] = br.readLine().toCharArray();
			int pos = 1; 
			
			for(int j = input.length -1; j>=0; j--) { //뒤에서 부터 자릿수 증가시키기
				alpha[input[j] - 'A'] += Integer.valueOf(pos);
				pos*=10; //자릿수 증가
			}
		}
		
		//Collections.reverseOrder를 사용하기 위해서는 Integer로 배열을 선언해야 한다.
		Arrays.sort(alpha, Collections.reverseOrder()); 
	
		int value = 9, answer = 0;
		
		for(int i=0; i<alpha.length; i++) {
			if(alpha[i] == 0) { //더이상 계산할 단어가 없으면 종료
				break;
			}
			answer += alpha[i] * value--;
		}
	
		System.out.println(answer);
	
	}
}