문제 : boj12400
필요 알고리즘 개념
- 애드 혹(ad hoc)
- 정형화된 방식이 존재하지 않고 이 문제만의 아이디어를 생각해내야 한다.
- 구현, 문자열
- 풀이를 일단 생각해냈다면 그 이후론 요 태그이긴 한데, 그냥 생각난걸 구현할 수 있냐는 의미이다.
※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.
풀이
문제 지문에서 제시된건 'a' -> 'y', 'o' -> 'e', 'z' -> 'q' 이다. 여기서 알 수 있는 점은 변경되는 문자열 사이에 동일한 규칙이 없다는 점이다(예를들어서 'a'->'c', 'b'->'d', 'c'->'e' 이런식이였으면 2칸씩 차이난다고 생각할 수도 있었다.).
알아야하는건 모든 'a'부터 'z'에 대해 어떻게 변경되는지이다. 현재 문제 지분을 통해 알고있는건 'a', 'o', 'z'이다. 추가로 알 수 있는 방법은 예제 입력 1과 에제 출력 1을 통해서이다. 그 둘을 합치면, 'q' 를 제외한 모든 매핑을 알 수 있다. 'q' 하나만 남았으므로, 매핑되는 문자에 대해서도 하나가 남을 것이다. 'a'~'z'까지 전부 확인해보면 'z'가 아직 매핑되지 않았음을 알 수 있고, 따라서 'q'->'z'임을 알 수 있다.
'a'~'z'가 모두 어떤 문자로 변경되는지 알았으므로, 이제 각 테스트 케이스를 입력받으면서 모든 문자를 매핑에 따라 변경해주면 된다. 물론 소문자만 변경해줘야 한다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
private static final String[] FROM = {
"aoz",
"ejp mysljylc kd kxveddknmc re jsicpdrysi",
"rbcpc ypc rtcsra dkh wyfrepkym veddknkmkrkcd",
"de kr kd eoya kw aej tysr re ujdr lkgc jv"
};
private static final String[] TO = {
"yeq",
"our language is impossible to understand",
"there are twenty six factorial possibilities",
"so it is okay if you want to just give up"
};
char[] mapping;
private int atoi(char c) {return c-'a';}
private void init() {
mapping = new char['Z'-'A'+1];
for (int i = 0; i < FROM.length; i++) {
String from = FROM[i];
String to = TO[i];
for (int j = 0; j < from.length(); j++) {
if (from.charAt(j)>='a'&&from.charAt(j)<='z')
mapping[atoi(from.charAt(j))] = to.charAt(j);
}
}
mapping[atoi('q')] = 'z';
}
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
init();
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= t; tc++) {
String cur = br.readLine();
sb.append(String.format("Case #%d: ", tc));
for (int i = 0; i < cur.length(); i++) {
char c = cur.charAt(i);
sb.append(c>='a'&&c<='z' ? mapping[atoi(c)] : c);
}
sb.append('\n');
}
System.out.print(sb);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 10178 - 할로윈의 사탕 (java) (0) | 2022.10.25 |
---|---|
[자바] 백준 16395 - 파스칼의 삼각형 (java) (0) | 2022.10.25 |
[자바] 백준 25757 - 임스와 함께하는 미니게임 (java) (0) | 2022.10.24 |
[자바] 백준 25756 - 방어율 무시 계산하기 (java) (0) | 2022.10.24 |
[자바] 백준 11068 - 회문인 수 (java) (0) | 2022.10.21 |
댓글