출처: https://www.acmicpc.net/problem/1755
1755번: 숫자놀이
79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로
www.acmicpc.net
생각
한자리 수인 경우는 띄어쓰기 없이 하나의 단어만 출력하는 것을 몰라서 틀렸다.
Comparator 사용하는 것이 아직 안 익숙해서 무식하게 정렬하고 해시에서 찾는 방법으로 구현했다. 입력이 99까지라서 시간 초과는 나지 않았다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;
public class BOJ1755 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
String[] words = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
String[] toFindNum = new String[N - M + 1]; // 숫자를 영어로 바꾼 문자열을 저장할 것. M부터 N까지라서 배열 개수는 N-M+1
HashMap<String, Integer> numStrHM = new HashMap<>(); // 문자열(예:"eight zero"), 숫자(예:80)를 쌍으로 해시맵에 저장
for (int i = 0, n = M; i < toFindNum.length; n++, i++) { // i는 숫자 개수를 세기 위한 인덱스, n은 실제 해당 숫자를 표현할 인덱스
int first = n / 10; // 99이하의 수이기 때문에 십의 자리
int last = n % 10; // 일의 자리
String numStr = (first == 0) ? words[last] : (words[first] + " " + words[last]);
toFindNum[i] = numStr; // 영어 문자열 리스트에 넣기
numStrHM.put(numStr, n); // (영어 문자열, 숫자) 쌍을 해시맵에 넣기
}
Arrays.sort(toFindNum); // 정렬
for (int i = 0, j = 1; i < toFindNum.length; i++, j++) {
bw.write(numStrHM.get(toFindNum[i]) + " "); // 해당 문자열에 맞는 숫자를 출력
if (j % 10 == 0) { // 10자리마다 줄을 바꾸기
bw.write("\n");
}
}
bw.write("\n");
bw.flush();
bw.close();
}
}
'알고리즘 > 백준저지' 카테고리의 다른 글
백준저지 14442번 벽 부수고 이동하기 2 (Java) (0) | 2021.10.05 |
---|---|
백준저지 2206번 벽 부수고 이동하기 (Java) (0) | 2021.10.04 |
백준저지 14502번 연구소 (0) | 2021.09.26 |
백준저지 2667번 단지번호붙이기 (0) | 2021.09.20 |
백준저지 1463번 1로 만들기 (0) | 2021.09.15 |