• 생각

3달만에 다시 풀어보았다. 로그인이 안되어있어서 익숙한데 안푼 문제인줄알고 풀었다.

접근방식은 전과 같은 방법으로 접근하였고 결과는 메모리, 시간 모두 더 높게 나왔지만 코드는 비슷했다.

(java8 버전과 java11버전일때의 다른 점인것 같다) 

 

푼 방식은 대문자 알파벳은 26개가 최대라는 점을 이용하여 풀었다.

배열을 26크기로 만든 뒤

N개의 모든 A위치의 값은 0 index에 넣고

N개의 모든 B위치의 값은 1 index에 넣고

.... Z까지 한 뒤 배열을 거꾸로 정렬해준 뒤, 가장 값이 큰 알파벳부터 9, 8, 7 ... 1까지 입력해주면 된다.

 

  • 코드

정답 코드 : 백트래킹 문제였는데 수학적으로 접근하는게 더 좋은 것 같다. 입력은 대문자 알파벳(26개)로 제한되어 있다. int 배열 index에 0~25를 A~Z입력일 때 math.pow(10,자릿수)만큼 더 해준다음 가장 높은 값부터 9~0곱해주며 더 해준다.

 

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 []number = new int[26];
		
		int N = Integer.parseInt(br.readLine());
		for(int i = 0; i < N; i++) {
			String temp = br.readLine();
			int tmp = 0;
			for(int j = temp.length()-1; j >= 0 ;j--) {
				number[temp.charAt(j) - 'A'] += Math.pow(10,tmp++);
			}			
		}
		Arrays.sort(number);
		
		int result = 0, num=9;
		for(int i = 25; i >= 0; i--) {
			if(number[i]==0) break;
			result+=number[i]*num--;
		}
		System.out.println(result);		
    }
}

 

3달 뒤 혼자 다시 풀어본 코드 : 방식은 위와 비슷한 방식으로 풀었다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	static int answer;

	public static void main(String[] args) throws Exception {
		SetData();
		System.out.println(answer);
	}
	
	private static void SetData() throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		answer = 0;
		int[] array = new int[26];
		
		for(int i = 0; i < N; i++) {
			String s = br.readLine();
			int temp = 1;
			for(int j = s.length() - 1; j >= 0; j--) {
				array[s.charAt(j) - 'A'] += temp;
				temp *= 10;
			}
		}
		
		Arrays.sort(array);
		int temp = 25;
		for(int i = 9; i >= 1; i--) {
			answer += array[temp--]*i;
		}
	}
	
}

+ Recent posts