[Silver IV] 숫자놀이 - 1755
성능 요약
메모리: 18708 KB, 시간: 244 ms
분류
정렬, 문자열
제출 일자
2024년 5월 30일 20:49:15
문제 설명
79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로 먼저 온다.
문제는 정수 M, N(1 ≤ M ≤ N ≤ 99)이 주어지면 M 이상 N 이하의 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력하는 것이다.
입력
첫째 줄에 M과 N이 주어진다.
출력
M 이상 N 이하의 정수를 문제 조건에 맞게 정렬하여 한 줄에 10개씩 출력한다.
코드
package 숫자놀이;
import java.util.*;
import java.util.stream.Collector;
public class Main {
public static void main(String[] args) {
Map<Integer, String> numMap = new HashMap<Integer, String>();
numMap.put(1, "one");
numMap.put(2, "two");
numMap.put(3, "three");
numMap.put(4, "four");
numMap.put(5, "five");
numMap.put(6, "six");
numMap.put(7, "seven");
numMap.put(8, "eight");
numMap.put(9, "nine");
numMap.put(0, "zero");
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int M = scanner.nextInt();
//TreeSet<String> digitSet = new TreeSet<>(); // 이름을 역순으로 정렬하는 TreeSet
Map<Integer, String> digitMap = new LinkedHashMap<>();
for(int i = N; i<=M; i++){
String digit = "";
if(i >= 10){
String[] strList = String.valueOf(i).split("");
int front = Integer.parseInt(strList[0]);
int back = Integer.parseInt(strList[1]);
digit = numMap.get(front) + " " + numMap.get(back);
}else{
digit = numMap.get(i);
}
digitMap.put(i, digit);
}
// 엔트리 리스트를 값 기준으로 정렬하기
List<Map.Entry<Integer, String>> sortedEntries = new ArrayList<>(digitMap.entrySet());
Collections.sort(sortedEntries, new Comparator<Map.Entry<Integer, String>>() {
@Override
public int compare(Map.Entry<Integer, String> entry1, Map.Entry<Integer, String> entry2) {
return entry1.getValue().compareTo(entry2.getValue());
}
});
StringBuilder outputBuffer = new StringBuilder(); // 결과를 저장할 StringBuilder 생성
int count = 0; // 숫자가 출력된 횟수를 나타내는 변수를 0으로 초기화합니다.
for (Map.Entry<Integer, String> entry : sortedEntries) {
if (count == 10) { // 10개의 숫자가 출력된 후에는 줄 바꿈을 합니다.
outputBuffer.append("\n");
count = 0; // 숫자가 출력된 횟수를 초기화합니다.
}
if (count > 0) { // 첫 번째 숫자가 아닌 경우에는 공백을 출력합니다.
outputBuffer.append(" ");
}
outputBuffer.append(entry.getKey()); // 숫자를 StringBuilder에 추가합니다.
count++; // 숫자가 출력된 횟수를 증가시킵니다.
}
// StringBuilder에 저장된 결과를 한 번에 출력합니다.
System.out.print(outputBuffer.toString());
}
}
몰랐던 것
- Map 자료구조를 Value를 기준으로 정렬하기 위해서는 ArrayList자료구조에 담아 처리해야한다.
- 이에 도움을 주는 자바API는 Collections.sort메소드를 이용하여 매개변수에 표현식을 삽입하여 처리 할 수 있다.
Collections.sort(sortedEntries, new Comparator<Map.Entry<Integer, String>>() {
@Override
public int compare(Map.Entry<Integer, String> entry1, Map.Entry<Integer, String> entry2) {
return entry1.getValue().compareTo(entry2.getValue());
}
});
함수 호출 시 2번째 매개변수에 표현식을 삽입하는 것을 "익명 클래스"
를 사용한다고 할 수 있습니다.
익명 클래스는 이름이 없는 클래스로, 클래스를 정의하면서 동시에 인스턴스를 생성할 수 있습니다. 주로 인터페이스나 추상 클래스를 구현하거나 상속하는 용도로 사용됩니다.
위의 코드에서는 Comparator 인터페이스를 구현하는 익명 클래스를 정의하여 Collections.sort 메서드에 전달했습니다. 이 익명 클래스는 compare 메서드를 오버라이딩하여 두 개의 Map.Entry<Integer, String> 객체를 비교하고 있습니다.
- 만약,
내림차순
정렬을 원한다면 return 문의 entry1, entry2의 위치를 바꾸어주어야 합니다.
| entry2.getValue().compareTo(entry1.getValue());
'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글
시간복잡도 (0) | 2024.05.31 |
---|---|
[백준]알고리즘의 수행 시간 2 - 24263번 (0) | 2024.05.31 |
[백준] 파일 정리 - 20291번 (1) | 2024.05.30 |
[백준] 회사에 있는 사람 - 7785번 (0) | 2024.05.30 |
[백준] 평균 - 1546번 (0) | 2024.05.30 |