[Bronze II] 복호화 - 9046
성능 요약
메모리: 31120 KB, 시간: 36 ms
분류
구현, 문자열
제출 일자
2024년 9월 10일 19:56:51
문제 설명
암호학에서 치환 암호(substitution cipher)란, 평문에 들어있는 각각의 문자를 주어진 치환 방법으로 암호화하는 방법 중 하나다.
가장 단순한 방법은 평문의 알파벳을 암호문의 알파벳으로 대치시켜 치환시키는 것이다.
예를 들어, 아래와 같은 알파벳 대치표가 주어졌다고 하자.
- 평문 알파벳 대치표 : abcdefghijklmnopqrstuvwxyz
- 암호문 알파벳 대치표 : wghuvijxpqrstacdebfklmnoyz
위에 주어진 치환 방법을 통해 암호화하면 평문 "hello there"은 "xvssc kxvbv"가 된다.
한 가지 흥미로운 점은 영어 문법 특성상, 알파벳 'e'가 다른 영문 알파벳에 비해 자주 쓰인다는 것이다.
즉, 암호문 알파벳 대치표 없이 암호문을 복호화하려 할 때, 암호문 알파벳 빈도수를 체크하면 암호문 알파벳 빈도수 중 가장 빈번하게 나타나는 알파벳이 'e'라는 사실을 유추해볼 수 있다.
위 방법으로 암호문 알파벳의 빈도수를 체크하고, 가장 빈번하게 나타나는 문자를 출력하는 프로그램을 작성하면 된다.
만약 주어진 암호문에서 가장 빈번하게 나타나는 문자가 여러 개일 경우, 그 빈번한 문자 중 어느 것이 평문 알파벳 'e'를 가리키는지 확실하게 알 수 없기 때문에 "모르겠음"을 의미하는 '?'를 출력하면 된다.
입력
입력의 T(1 ≤ T ≤ 20)는 테스트 케이스로, 입력 제일 상단에 주어진다. 각각의 테스트 케이스는 한 줄마다 소문자와 공백으로 이루어진 영어 문장이 주어진다. 이 문장의 길이는 적어도 1이상이며 255이하다.
출력
각각의 테스트 케이스에 대해, 가장 빈번하게 나타나는 문자를 출력하거나 빈번하게 나타나는 문자가 여러 개일 경우 '?'를 출력한다.
아쉬운 풀이
딕셔너리 사용하여 알파벳 개수를 모으는 코드이다. 나중에 다른 사람의 풀이를 보니 DP로 깔끔하게 푸는 모습을 보이는데, 그 방식이 덜 복잡해보였다.
import sys
T = int(sys.stdin.readline().rstrip())
for i in range(T):
text = sys.stdin.readline().rstrip().replace(" ", "")
temp = {}
for v in text:
if v in temp:
temp[v] +=1
else: temp[v] = 1
maxVal, doubleCheck, alphabet = 0, False, -1
for key,val in temp.items():
if val > maxVal:
maxVal = val
doubleCheck = False
alphabet = key
elif val == maxVal:
doubleCheck = True
if doubleCheck: print("?")
else: print(alphabet)
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 듣보잡- python[ 집합, 정렬 ] (0) | 2024.09.28 |
---|---|
[백준] 요세푸스 문제- python[ 구현 ] (0) | 2024.09.27 |
[백준] 8진수 2진수 - python[ 구현 ] (0) | 2024.09.09 |
[백준] 곱셈- python[ 구현 ] (0) | 2023.11.13 |
[백준] 최단경로- python[ Dijkstra ] (1) | 2023.11.01 |
[Bronze II] 복호화 - 9046
성능 요약
메모리: 31120 KB, 시간: 36 ms
분류
구현, 문자열
제출 일자
2024년 9월 10일 19:56:51
문제 설명
암호학에서 치환 암호(substitution cipher)란, 평문에 들어있는 각각의 문자를 주어진 치환 방법으로 암호화하는 방법 중 하나다.
가장 단순한 방법은 평문의 알파벳을 암호문의 알파벳으로 대치시켜 치환시키는 것이다.
예를 들어, 아래와 같은 알파벳 대치표가 주어졌다고 하자.
- 평문 알파벳 대치표 : abcdefghijklmnopqrstuvwxyz
- 암호문 알파벳 대치표 : wghuvijxpqrstacdebfklmnoyz
위에 주어진 치환 방법을 통해 암호화하면 평문 "hello there"은 "xvssc kxvbv"가 된다.
한 가지 흥미로운 점은 영어 문법 특성상, 알파벳 'e'가 다른 영문 알파벳에 비해 자주 쓰인다는 것이다.
즉, 암호문 알파벳 대치표 없이 암호문을 복호화하려 할 때, 암호문 알파벳 빈도수를 체크하면 암호문 알파벳 빈도수 중 가장 빈번하게 나타나는 알파벳이 'e'라는 사실을 유추해볼 수 있다.
위 방법으로 암호문 알파벳의 빈도수를 체크하고, 가장 빈번하게 나타나는 문자를 출력하는 프로그램을 작성하면 된다.
만약 주어진 암호문에서 가장 빈번하게 나타나는 문자가 여러 개일 경우, 그 빈번한 문자 중 어느 것이 평문 알파벳 'e'를 가리키는지 확실하게 알 수 없기 때문에 "모르겠음"을 의미하는 '?'를 출력하면 된다.
입력
입력의 T(1 ≤ T ≤ 20)는 테스트 케이스로, 입력 제일 상단에 주어진다. 각각의 테스트 케이스는 한 줄마다 소문자와 공백으로 이루어진 영어 문장이 주어진다. 이 문장의 길이는 적어도 1이상이며 255이하다.
출력
각각의 테스트 케이스에 대해, 가장 빈번하게 나타나는 문자를 출력하거나 빈번하게 나타나는 문자가 여러 개일 경우 '?'를 출력한다.
아쉬운 풀이
딕셔너리 사용하여 알파벳 개수를 모으는 코드이다. 나중에 다른 사람의 풀이를 보니 DP로 깔끔하게 푸는 모습을 보이는데, 그 방식이 덜 복잡해보였다.
import sys
T = int(sys.stdin.readline().rstrip())
for i in range(T):
text = sys.stdin.readline().rstrip().replace(" ", "")
temp = {}
for v in text:
if v in temp:
temp[v] +=1
else: temp[v] = 1
maxVal, doubleCheck, alphabet = 0, False, -1
for key,val in temp.items():
if val > maxVal:
maxVal = val
doubleCheck = False
alphabet = key
elif val == maxVal:
doubleCheck = True
if doubleCheck: print("?")
else: print(alphabet)
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 듣보잡- python[ 집합, 정렬 ] (0) | 2024.09.28 |
---|---|
[백준] 요세푸스 문제- python[ 구현 ] (0) | 2024.09.27 |
[백준] 8진수 2진수 - python[ 구현 ] (0) | 2024.09.09 |
[백준] 곱셈- python[ 구현 ] (0) | 2023.11.13 |
[백준] 최단경로- python[ Dijkstra ] (1) | 2023.11.01 |