[Algorithm Study] 백준 1755
문제 출처 : https://www.acmicpc.net/problem/1755
문제 접근
문제를 읽어보면 숫자를 그 자체로 보는 것이 아닌 각 자리수의 수를 영어로 읽어 정렬하는 방식입니다. 그래서 hashmap을 활용하여 0~9를 key로 하고 그에 해당하는 영어(zero~nine)을 value로 선언해 문제를 해결했습니다.
문자열을 비교하는데 있어서 자바에서 제공해주는 compareTo를 활용했습니다.
compareTo의 사용방식은 다음과 같습니다. 기준값.compareTo(비교 값)으로 사용됩니다.
기준 값과 비교 값이 숫자인 경우 (1)두 숫자가 같은 경우에는 0을 반환하며 (2)기준값이 비교 값보다 큰 경우에는 1을 (3) 기준값이 비교 값보다 작은 경우에는 -1을 반환해줍니다.
기준 값과 비교 값이 문자열인 경우에는 (1) 비교 값이 기준값에 포함되어 있는 경우에는 서로의 문자열 길이의 차를 반환 해줍니다. (단 앞글자부터 비교가 진행 즉, 기준값이 "abcd"이고 비교 값이 "bc"이면 앞글자부터 비교가 발생하므로 포함되어 있는 것으로 인식 X)
ex) "apple".compareTo("a") 이면 "a"는 "apple"에 포함되어 있으므로 4를 반환하게 됩니다.
(2) 비교 값이 기준값에 포함되어 있지 않은 경우에는 앞 글자의 유니코드 값의 차를 반환해 줍니다.
ex) "apple".compareTo("b")이면 "a"의 유니코드 값은 97 "b"의 유니코드 값은 98이므로 -1이 반환됩니다.
이를 활용하여 각 숫자들의 영어들은 서로 포함되거나 포함하는 경우가 없기에 각 숫자의 영어를 비교했을 때 음수가 반환되면 사전 순으로 앞선 수라고 하여 문제를 해결했습니다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class BOJ_1755 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
HashMap<Character, String> dic = new HashMap<Character, String>();
dic.put('0', "zero");
dic.put('1', "one");
dic.put('2', "two");
dic.put('3', "three");
dic.put('4', "four");
dic.put('5', "five");
dic.put('6', "six");
dic.put('7', "seven");
dic.put('8', "eight");
dic.put('9', "nine");
st = new StringTokenizer(br.readLine());
String start = st.nextToken();
String end = st.nextToken();
int[] num = new int[Integer.parseInt(end)-Integer.parseInt(start)+1];
int idx = 0;
for(int i = Integer.parseInt(start); i <= Integer.parseInt(end); i++){
num[idx++] = i;
}
for(int i = 0; i < idx-1; i++){ // 기준
int small = i;
for(int j = i+1; j < idx; j++){ // 비교대상
String num1 = String.valueOf(num[small]);
String num2 = String.valueOf(num[j]);
for(int k = 0; k < num1.length(); k++){ //비교과정
if(dic.get(num1.charAt(k)).compareTo(dic.get(num2.charAt(k)))>0){
small = j;
break;
}
else if(dic.get(num1.charAt(k)).compareTo(dic.get(num2.charAt(k))) == 0){
if(num1.length() > num2.length()){
small = j;
break;
}
}
else if(dic.get(num1.charAt(k)).compareTo(dic.get(num2.charAt(k)))<0) break;
}
}
int temp = num[small];
num[small] = num[i];
num[i] = temp;
}
for(int i = 0; i < idx; i++){
System.out.print(num[i]+" ");
if(i % 10 == 9) System.out.println();
}
}
}
Author And Source
이 문제에 관하여([Algorithm Study] 백준 1755), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seokhwan-an/Algorithm-Study-백준-1755저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)