본문 바로가기
코딩테스트

[백준] 1339번 '단어 수학' - Java

by CuckooBird 2023. 7. 8.

문제


코드

맞았습니다가 뜬 코드입니다. - 메모리 14296KB | 시간 132ms | 코드 길이 1049B

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

public class Main {
	private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
	private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	
	public static void main(String[] args) throws IOException {
		StringTokenizer st = new StringTokenizer(bf.readLine());
		
		int n = Integer.parseInt(st.nextToken());
		int[] alphabet = new int[26];
		
		for(int i = 0 ; i < n ; i++) {
			int cnt = 0;
			StringTokenizer st_alphabet = new StringTokenizer(bf.readLine());
			String str = st_alphabet.nextToken();
			cnt = str.length();
			for(int j = 0 ; j < str.length() ; j++) {
				char ch = str.charAt(j);
				alphabet[ch - 65] += (int) (Math.pow(10, cnt--)/10);
			}
		}
		Arrays.sort(alphabet);
		int ans = 0;
		int s = 9;
		for(int i = alphabet.length - 1 ; i >= 0 ; i--) {
			if(alphabet[i] == 0) {
				break;
			}
			ans += (s--) * alphabet[i];
		}
		
		bw.write(Integer.toString(ans));
		
		bf.close();
		bw.flush();
		bw.close();
	}
}

 

str에 문자열을 입력받고, 문자열 첫번째 문자부터 순서대로 10에 문자열의 길이(실행 할 시에 1씩 빼어줌)를 제곱한 수를 해당 문자의 배열(alphabet배열)에 더해주었습니다. 그리고 10을 다시 나누어 문자열에 맞는 제곱수로 바꾸어줍니다. 만약 ABC이면 A는 1000이 들어가게 되는데, 100을 넣는다는 말입니다. 왜냐하면 ABC가 A = 9 , B = 8 , C = 7 이라고 한다면, ABC는 987이라는 수가 되어야하기 때문에 9 * 1000이 아니라 9*100이 되어야 한다는 말입니다.

for(int i = 0 ; i < n ; i++) {
			int cnt = 0;
			StringTokenizer st_alphabet = new StringTokenizer(bf.readLine());
			String str = st_alphabet.nextToken();
			cnt = str.length();
			for(int j = 0 ; j < str.length() ; j++) {
				char ch = str.charAt(j);
				alphabet[ch - 65] += (int) (Math.pow(10, cnt--)/10);
			}
		}

 

만약 ACDFB를 입력받았다고 한다면,

A = 100000 / 10 = 10000 이 들어가게 되고

C = 10000 / 10 = 1000 이, D = 1000 / 10 = 100 이, F = 100 / 10 = 10, B = 1 이 들어가게 되겠죠?

 

그리고 이 수행을 입력받는 n회 동안에 하여 alphabet 배열 각 알파벳에 해당하는 인덱스에 누적해줍니다.

그럼 가장 큰 값이 있고, 두번째로 큰값, 같은 값 등등을 알 수 있겠죠?

어차피 다 더하니까 같은 값에 대한 것은 생략하기로 하고, 큰 값을 순차적으로 알아내기 위해 Arrays.sort(alphabet) 함수를 통해 정렬해줍니다.

 

int ans = 0;
		int s = 9;
		for(int i = alphabet.length - 1 ; i >= 0 ; i--) {
			if(alphabet[i] == 0) {
				break;
			}
			ans += (s--) * alphabet[i];
		}
		
		bw.write(Integer.toString(ans));

그리고 순서대로 9부터 곱하여 ans값에 누적해줍니다.