Post

BOJ_14369_전화번호 수수께끼(Small) (Java)

BOJ_14369_전화번호 수수께끼(Small) (Java)

[Gold V] 전화번호 수수께끼 (Small) - 14369

문제 링크

성능 요약

메모리: 14948 KB, 시간: 124 ms

분류

애드 혹, 브루트포스 알고리즘, 문자열

제출 일자

2024년 12월 9일 22:43:52

문제 설명

"전화번호가 뭐에요?"

"제 전화번호의 각 자리를 영어단어로 바꾸고, 철자를 잘 섞으면 OZONE TOWER가 나와요."

"예?"

"그리고 제 전화번호는 오름차순으로 정렬되어 있어요."

"..."

입력

첫 줄에 테스트케이스의 개수 T가 주어진다. 각 테스트케이스에는 상대방이 제시한 스트링 S가 주어진다. S는 영어 대문자로만 이루어져 있다.

1≤ T ≤ 100이고, S의 길이는 3 이상 20 이하이다. 모든 테스트케이스에는 유일한 해답이 있다.

출력

각 줄에 테스트케이스 번호 x와 전화번호 y를 Case #x: y의 형태로 출력한다.

문제 풀이

각 숫자를 어떤 순서로 처리해야 편한지 고민했다!

자세한 풀이는 코드 속 주석 참조

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
 * Author: nowalex322, Kim HyeonJae
 */
import java.io.*;
import java.util.*;

public class Main {
	class Number {
		String s;
		char c;
		int n;

		public Number(String s, char c, int n) {
			this.s = s;
			this.c = c;
			this.n = n;
		}
	}

	static BufferedReader br;
	static BufferedWriter bw;
	static StringTokenizer st;
	Number[] number = { new Number("ZERO", 	'Z', 0),
						new Number("SIX", 	'X', 6), 
						new Number("EIGHT", 'G', 8), 
						new Number("TWO", 	'W', 2),
						new Number("THREE", 'T', 3), 
						new Number("SEVEN", 'S', 7), 
						new Number("FIVE", 	'V', 5), 
						new Number("FOUR", 	'F', 4),
						new Number("NINE", 	'I', 9), 
						new Number("ONE", 	'N', 1) };

	public static void main(String[] args) throws Exception {
		new Main().solution();
	}

	public void solution() throws Exception {
//		br = new BufferedReader(new InputStreamReader(System.in));
		br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));
		bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int T = Integer.parseInt(br.readLine());

		for (int tc = 1; tc <=T; tc++) {
			/*
			 * 1. 0 : Z 개수로 찾기 - 25
			 * 2, 6 : X 개수로 찾기 - 23
			 * 3. 8 : G 개수로 찾기 - 6
			 * 4. 2 : W개수로 찾기 - 22
			 * 5. 3 : TWO, EIGHT 찾은 후 T로 찾기 - 19
			 * 6. 7 : SIX 찾은 후 S로 찾기 - 18
			 * 7. 5 : SEVEN 다 찾은 후 V로 찾기 - 21
			 * 8. 4 : FIVE 다 찾은 후 F로 찾기 - 5
			 * 9. 9 : I 개수로 찾기 - 8
			 * 10 0 : 나머지 N개수로 찾기 - 13
			 */

			int[] arr = new int[26]; // A~Z;
			String str = br.readLine();
			for (int i = 0; i < str.length(); i++) {
				arr[str.charAt(i) - 'A']++;
			}

			int[] numCnt = new int[10];
			for (int i = 0; i < 10; i++) {
				int tmpCnt = 0;
				if (arr[number[i].c-'A'] > 0) {
					tmpCnt = arr[number[i].c-'A'];
					numCnt[number[i].n] += tmpCnt;
					for (int j = 0; j < number[i].s.length(); j++) {
						arr[number[i].s.charAt(j)-'A'] -= tmpCnt;
					}
				}
			}
			StringBuilder sb = new StringBuilder();
			for(int i=0; i<10; i++) {
				for(int j=0; j<numCnt[i]; j++) {
					sb.append(i);					
				}
			}
			bw.write("Case #" + tc + ": " + sb.toString() + "\n");
		}


		bw.flush();
		bw.close();
		br.close();
	}
}
This post is licensed under CC BY 4.0 by the author.