99클럽 코테 스터디 30일차 TIL
💙 JAVA 비기너
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] wordArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
PriorityQueue<String> wordHeap = new PriorityQueue<>();
HashMap<String, Integer> wordHash = new HashMap<>();
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
for(int i=M; i<=N; i++) {
String word = "";
int first = i / 10;
int second = i % 10;
if(first != 0) word += wordArr[first];
word += wordArr[second];
wordHash.put(word, i);
wordHeap.add(word);
}
int count = 0;
while(!wordHeap.isEmpty()) {
String word = wordHeap.poll();
bw.write(String.valueOf(wordHash.get(word)));
count++;
if(count == 10) {
bw.write("\n");
count = 0;
} else {
bw.write(" ");
}
}
br.close();
bw.flush();
bw.close();
}
}
숫자를 영어로 치환하고 그걸 정렬한 다음 다시 숫자로 치환하라고?! 에라이~~🤬
가장 먼저 해야하는 일은 역시 최솟값 M
과 최댓값 N
까지의 숫자들을 구해야하는 것이다.
그래서 for문을 M
과 N
사이로 돌게 하였고 숫자는 10으로 나눈 몫을 first
(첫번째 자리에 있으니깐), 10으로 나눈 후 발생하는 나머지값을 second
(두번째 자리에 있으니깐)로 저장했다.
이것은 정수 M, N(1 ≤ M ≤ N ≤ 99)이라는 조건이 있어서 가능한 방법이다.
그래서 이 first
와 second
를 인덱스에 맞춰 영어단어를 저장한 문자열배열 wordArr
을 통해 각각 영어단어로 치환하고 문자열 word
에 저장한다.
이 때 해시 wordHash
에 치환한 문자열 word
와 원래 숫자인 for문의 i
를 저장해놔서 다시 문자열을 숫자로 치환하기 쉽도록 하고 minHeap인 wordHeap
에 word
를 넣어 사전순으로 정렬되도록 한다.
숫자들도 구했고 정렬도 완료했다면 이제 하나씩 출력할 차례다.
wordHeap
에 있는 요소를 차례대로 탈탈 털어서 출력하는데 문자열이 아니라 다시 숫자로 출력해야하므로 wordHash
를 통해 해당 문자열이 어떤 숫자인지 찾은 다음 출력해준다.
이 때, 한줄에 10개씩 출력되어야 하므로 count
를 통해 한줄에 몇개의 정수가 출력되었는지 체크하고 10개가 되었다면 개행처리를 해줬다.