본문 바로가기
PS/BOJ

[자바] 백준 12400 - Speaking in Tongues (Small) (java)

by Nahwasa 2022. 10. 24.

 문제 : 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();
    }
}

댓글