문제
암호학에서 치환 암호(substitution cipher)란, 평문에 들어있는 각각의 문자를 주어진 치환 방법으로 암호화하는 방법 중 하나다.
가장 단순한 방법은 평문의 알파벳을 암호문의 알파벳으로 대치시켜 치환시키는 것이다.
예를 들어, 아래와 같은 알파벳 대치표가 주어졌다고 하자.
- 평문 알파벳 대치표 : abcdefghijklmnopqrstuvwxyz
- 암호문 알파벳 대치표 : wghuvijxpqrstacdebfklmnoyz
위에 주어진 치환 방법을 통해 암호화하면 평문 "hello there"은 "xvssc kxvbv"가 된다.
한 가지 흥미로운 점은 영어 문법 특성상, 알파벳 'e'가 다른 영문 알파벳에 비해 자주 쓰인다는 것이다.
즉, 암호문 알파벳 대치표 없이 암호문을 복호화하려 할 때, 암호문 알파벳 빈도수를 체크하면 암호문 알파벳 빈도수 중 가장 빈번하게 나타나는 알파벳이 'e'라는 사실을 유추해볼 수 있다.
위 방법으로 암호문 알파벳의 빈도수를 체크하고, 가장 빈번하게 나타나는 문자를 출력하는 프로그램을 작성하면 된다.
만약 주어진 암호문에서 가장 빈번하게 나타나는 문자가 여러 개일 경우, 그 빈번한 문자 중 어느 것이 평문 알파벳 'e'를 가리키는지 확실하게 알 수 없기 때문에 "모르겠음"을 의미하는 '?'를 출력하면 된다.
입력
입력의 T(1 ≤ T ≤ 20)는 테스트 케이스로, 입력 제일 상단에 주어진다. 각각의 테스트 케이스는 한 줄마다 소문자와 공백으로 이루어진 영어 문장이 주어진다. 이 문장의 길이는 적어도 1이상이며 255이하다.
출력
각각의 테스트 케이스에 대해, 가장 빈번하게 나타나는 문자를 출력하거나 빈번하게 나타나는 문자가 여러 개일 경우 '?'를 출력한다.
처음 쓴 코드
results = []
for _ in range(int(input())):
t = {}
for w in input():
if w == ' ':
continue
elif w not in t.keys():
t[w] = 1
else:
t[w] += 1
results.append(t)
for i in results:
r = [k for k,v in i.items() if v==max(i.values())]
if len(r) < 2:
print(r[0])
else:
print('?')
코딩테스트용 문법으로 수정
조금 더 간결하게 만들었다. 그리고 변수명은 읽기 좋은 이름으로 설정하자.
results = []
for _ in range(int(input())):
t = {}
for w in input():
if w == ' ':
continue
else:
t[w] = t.get(w,0) + 1 # 문자 w가 딕셔너리 t에 몇 번 나왔는지를 세는 로직.
results.append(t)
for i in results:
r = [k for k,v in i.items() if v==max(i.values())]
if len(r) < 2:
print(r[0])
else:
print('?')
수정된 부분인,
t[w] = t.get(w,0) + 1
.get() 메소드는 IDLE 기본 설명에 의하면 "Return the value of the key if key is in the dictionary" 라고 한다.
만약에 key가 없으면 default 값을 줄 수 있다.
t.get(w,0)는 딕셔너리 t에서 w라는 키가 있으면 그 값을 가져오고, 없으면 기본값인 0을 준다는 뜻이다.
그래서 없으면 0을 줘서 +1을 진행하는 것이고, 있으면 t[w]에서 +1을 진행해서 결국 단어의 개수를 세어주는 것과 같게 된다.
피드백 있으시다면 언제든 환영입니다! 감사합니닷.
'코딩테스트' 카테고리의 다른 글
[백준] 15649 N과 M (1) (0) | 2025.04.23 |
---|---|
[백준] 15650 N과 M (2) (0) | 2025.04.23 |
[백준] 1157 단어 공부 (0) | 2025.04.18 |
[백준] 10798 세로 읽기 (0) | 2025.04.18 |
[백준] 11720 숫자의 합 - 문제로 이해하는 이터러블(iterable), map() 함수, map 객체 (0) | 2025.04.18 |