-
백준 12400번 Speaking in Tongues :: 마이구미알고리즘 풀이/수학 2017. 2. 5. 20:29반응형
이번 문제는 백준 알고리즘 12400번 "Speaking in Tongues" 를 다뤄본다.
2012 Google Code Jam 에서 출제된 문제이다.
영어로 된 문제이기 때문에 해석이 필요하다.
해석만 가능하다면 굉장히 쉬운 문제이기 때문에 두려울 게 없다.
문제를 보자. (번역과 함께 보여주겠다)
We have come with up the best possible language here at Google, called Googlerese.
- 구글은 Googlerese라고 불리는 최고의 언어를 제시한다.
To translate text into Googlerese, we take any message and replace each English letter with another English letter.
- Googlerese를 통해 텍스트를 번역하기 위해 우리는 어느 메시지를 받아 각각의 영문자를 다른 영문자로 대체한다.
This mapping is one-to-one and onto, which means that the same input letter always gets replaced with the same output letter, different input letters always get replaced with the different output letters.
- 이 맵핑은 1:1 방식으로 같은 입력 글자는 항상 같은 출력 글자로 대체되고, 다른 입력 글자는 항상 다른 출력 글자로 대체된다.
A letter may be replaced by itself. Space are left as-is.
- 글자는 그 자체로 대체될 수도 있다. 공백은 그대로 유지된다.
For example(and here is a hint!), our awesome translation algorithm includes the following three mappings:
'a' -> 'y', 'o' -> 'e', and 'z' -> 'q'.
- 예를 들어(여기는 힌트), 우리는 굉장한 번역 알고리즘은 다음의 세가지 맵핑을 포함한다.
'a' -> 'y', 'o' -> 'e', and 'z' -> 'q'.
This means that 'a zoo' will become 'y qee'.
- 이 의미는 'a zoo'는 'y qee'로 되는 것이다.
Googlerese is based on the best possible replacement mapping, and we will naver change it.
- Googlerese은 최고의 대체 맵핑을 기반으로 하고, 절대 변경하지 않는다.
It will always be the same. In every test case.
- 모든 테스트 케이스에서 대체 맵핑은 항상 같다.
We will not tell you the rest of mapping because that would make the problem too easy, but there are a few examples below that may help.
- 우리는 문제가 너무 쉽기 때문에 당신에게 나머지 맵핑을 설명하지 않을 것이다. 그러나 도움이 될 만한 예제들이 아래에 있다.
문제를 보다시피, 각 글자에 대한 대체될 글자들이 존재한다.
그것만 찾는다면 문제를 쉽게 해결할 수 있다.
문제에서는 세가지만 알려주었다. ('a' -> 'y', 'o' -> 'e', and 'z' -> 'q')
또한 주어지는 예제를 통해 도움을 얻으라고 말해주고 있다.
노가다를 해서 각 대체 글자들을 찾으면 된다.
하지만 노가다 문제는 풀었다는 느낌을 못 받을 수 있다.
그렇기에 일일이 노가다로 찾지 않고, 코드를 짜서 찾아보자.
String Googlerese = "ejp mysljylc kd kxveddknmc re jsicpdrysi rbcpc ypc rtcsra dkh wyfrepkym veddknkmkrkcd de kr kd eoya kw aej tysr re ujdr lkgc jv"; String string = "our language is impossible to understandthere are twenty six factorial possibilitiesso it is okay if you want to just giveup";
위와 같이 예제로 주어진 입력과 출력을 그대로 복사하여 문자열을 만들어보자.
그 후 공백은 신경쓸 필요가 없기 때문에 공백을 제거하자.
Googlerese = Googlerese.replaceAll(" ", ""); string = string.replaceAll(" ", "");
그 후 두 문자열을 비교하면서 대체 글자에 대한 배열을 만들어 주면 된다.
char[] ans = new char[26]; for(int i=0;i<Googlerese.length();i++) { ans[Googlerese.charAt(i) - 'a'] = string.charAt(i); }
그 결과, ans 배열에는 대체 글자들이 존재하게 된다.
(ans[0]은 'a'를 의미한다. ans[0]의 값은 'a' 가 대체될 글자가 존재한다)
* q, z는 예제에서 주어지지 않았기 때문에 따로 넣어줘야한다.
이렇게 구함으로써, 일일이 노트에 적으면서 대체 글자를 찾을 필요가 없어진다.
노가다보다는 조금 더 생각하여 문제를 해결하자.
우리는 개발자이기 때문이다.
전체 소스는 아래 Github URL을 참고하자.
백준 알고리즘 12400번 Speaking in Tongues 전체 소스
https://github.com/hotehrud/acmicpc/blob/master/English/12400.java
반응형'알고리즘 풀이 > 수학' 카테고리의 다른 글
백준 10610번 30 [배수 판정법] :: 마이구미 (0) 2017.02.13 백준 12353번 Baby Height :: 마이구미 (0) 2017.02.07 백준 1940번 주몽 :: 마이구미 (2) 2016.12.17 백준 10974번 모든 순열 :: 마이구미 (0) 2016.10.25 백준 3053번 택시 기하학 :: 마이구미 (0) 2016.10.18