오늘의 커밋을 대체할 단어 수학 질문 #115
|
인찬님 풀이 보고나니까 이런 질문 하기 머쓱하긴 하지만...! 저는 최고 자릿수 비교하고, import java.io.*;
public class Main {
static int N; // 단어의 개수 - 최대 10
static int alphabetCount = 0; // 총 사용된 알파벳 수
static String[] words;
static int[] top; // 각 알파벳별 최고 자릿수
static int[] check; // 최종 매칭 저장
public static void main(String[] args) throws IOException{
System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
words = new String[N];
top = new int[26];
check = new int[26];
for(int i = 0 ; i < 26 ; i++){
top[i] = -1;
check[i] = -1;
}
for(int i = 0 ; i<N ; i++){
String word = br.readLine();
words[i] = word;
for(int j = 0 ; j< word.length(); j++){
// 사용한적 없는 알파벳이 사용되면 알파벳수 추가
int index = word.charAt(j)-'A';
int position = word.length() - j - 1;
if(top[index]==-1) alphabetCount++;
if(top[index]<position) top[index] = position;
}
}
// 가장 높은 자릿수 위치의 알파벳 구해서 9부터 차례로 대입
int biggest = 0 ;
int num = 9;
while(alphabetCount -- > 0){
for(int i = 0 ; i<26; i++){
// 이미 알파벳을 배정받았으면 넘어가기
if(check[i] != -1) continue;
// 최고 높이 비교후 교체
if(top[i]>top[biggest]){
biggest = i;
// 최고 높이가 같을때
}else if(top[i]== top[biggest] && i!=biggest){
check[i] = num;
int num_i = getResult(); // i 에 num이 들어간다면
check[i] = -1;
check[biggest] = num;
int num_biggest = getResult(); // biggiest에 num이 들어간다면
check[biggest] = -1;
if(num_i>num_biggest) biggest = i;
}
}
check[biggest] = num --;
// 다음 biggest 설정
for(int i = 0 ; i<26; i++){
if(check[i]==-1) {
biggest = i;
break;
}
}
}
int sum = getResult();
System.out.println(sum);
br.close();
}
// 현재까지 설정된 알파벳의 값을 이용하여 결과 계산
static int getResult(){
int sum = 0;
for(int i = 0 ; i<N ; i++){
for(int j = 0; j<words[i].length(); j++){
char temp = words[i].charAt(j) ;
// 배정받은 숫자가 없으면 넘어간다
if(check[temp- 'A']==-1) continue;
int num = check[temp - 'A'];
sum += Math.pow(10, words[i].length()-j -1)* num;
}
}
return sum;
}
} |
Replies: 2 comments 5 replies
|
우선, 인찬님 풀이방식으로 푸신것같은데.. 저는 인찬님 풀이를 정확히 이해하진 못해서 답변이 도움되지 않을수도있습니다..! 말씀해주신게 자릿수로 비교를 하신다고 하셨는데.. 문제에서 자릿수도 중요하지만 결국 중요한건 계수의 총 합이 가장 중요해요! 그래서 자릿수로 그리디를 적용하는게 아니라, 계수자체를 그리디로 적용해야합니다! |
|
저 비교하는 부분 코드를 보면 최고 높이가 같은 경우를 2가지로 제한하고 있지 않나하는 의문이 들긴 했습니다! 또 정훈님이 말씀해주신 것처럼 최고자릿수만으로 판단하기에는 반례가 상당히 많습니다. |
우선, 인찬님 풀이방식으로 푸신것같은데.. 저는 인찬님 풀이를 정확히 이해하진 못해서 답변이 도움되지 않을수도있습니다..!
말씀해주신게 자릿수로 비교를 하신다고 하셨는데.. 문제에서 자릿수도 중요하지만 결국 중요한건 계수의 총 합이 가장 중요해요!
극단적인 예이긴 하지만 예를 들어 입력으로 다음과 같이 들어온다면
BAAA
AAA
AAA
AAA
AAA
AAA
AAA
AAA
AAA
AAA
B=9, A=8 일때는 17880이지만
A=9, B=8 일때는 17990이 나와서 더 큰값이됩니다.
그래서 자릿수로 그리디를 적용하는게 아니라, 계수자체를 그리디로 적용해야합니다!
BAAA 는 1000B + 100A + 10A + 1A이고
AAA 는 100A + 10A + 1A 이므로,
위 입력의 총 합은 1110A + 1000B 가 됩니다. 따라서 A에 가장 큰수인 9를 대입해야하고 B에 8을 대입해줘야합니다!