BOJ 28125. 2023 아주머학교 프로그래딩 정시머힌
2023 아주대학교 프로그래밍 경시대회 APC Div.1 A번
String
https://www.acmicpc.net/problem/28125
28125번: 2023 아주머학교 프로그래딩 정시머힌
2023 APC를 총괄하고 있는 A.N.S.I 부회장 현빈이는 문제들을 검수하던 중 이상한 점을 발견하였다. 그것은 몇몇 단어들이 비슷하게 생겼지만, 다른 철자로 되어있었던 것이었다. 어리둥절한 현빈이
www.acmicpc.net
1. 문제 설명
2023 아주대학교 프로그래밍 경시대회 - Division 1의 A번 문제이다.
야민정음을 사용한 문자를 원래의 문자로 복원하면 된다.
예를 들어서, 아래와 같은 문자열이 있다고 가정하자.
my a\\'es0me s7r!ng
이것을 다시 my awesome string으로 돌리면 된다는 것이다.
문제를 처음 봤을 때 백준 2941번: 크로아티아 알파벳이 생각났다.
2. 문제 접근
원본이 a, c, i, i, j, n, o, t인 것들은 그대로 사용하면 된다.
하지만, 원본이 v와 w인 것은 문제가 발생한다.
c++ 혹은 java같은 다른 언어는 모르겠지만, python에서 문자열에 \가 들어있으면 \\로 입력해야 한다.
위의 my awesome string을 야민정음으로 작성한 것을 list에 넣고 출력하면 아래와 같다.
['m', 'y', ' ', 'a', '\\', "'", 'e', 's', '0', 'm', 'e', ' ', 's', '7', 'r', '!', 'n', 'g']
v와 w에 한하여 별도로 복원해야 하고, 나머지는 loop를 돌며 하나씩 복원한다.
별도로 복원하는 v와 w 중에서, w 먼저 복원해야 하는 것을 잊지 말자.
이유는 w로 복원해야 하는 것을 v로 복원할 수 있지만, v로 복원해야 하는 것은 w로 복원할 수 없기 때문이다.
w = \\'
v = \'
즉, v를 먼저 복원해버리면 \만 남아버리는.. 불상사가 발생한다.
단어를 복원할 때마다 카운팅하고, 복원한 문자열의 길이와 비교하여 출력하면 된다.
이때, 반드시 복원한 문자열의 길이여야 하는데,
야민정음으로 작성한 문자열은 \\' 등이 포함되어 정상적인 길이가 아니기 때문이다.
3. 구현 코드
from sys import stdin
word = {'@':'a', '[':'c', '!':'i', ';':'j', '^':'n', '0':'o', '7':'t'}
n = int(stdin.readline())
for _ in range(n):
tmp = stdin.readline().strip()
res = ''
cnt = 0
for i in tmp:
if i in word:
res += word[i]
cnt += 1
else:
res += i
if "\\\\'" in tmp:
cnt += res.count("\\\\'")
res = res.replace("\\\\'", 'w')
if "\\'" in tmp:
cnt += res.count("\\'")
res = res.replace("\\'", 'v')
if cnt*2 < (len(res)):
print(res)
else:
print("I don't understand")
\\을 어떻게 작성해야 출력할 수 있는지 오랜만에 느낀 문제였다.