Anagram(아나그램)
Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아
나그램이라고 합니다.
예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면
A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치합니다. 즉 어느 한 단어를 재
배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다.
길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세
요. 아나그램 판별시 대소문자가 구분됩니다.
▣ 입력설명
첫 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력됩니다.
단어의 길이는 100을 넘지 않습니다.
▣ 출력설명
두 단어가 아나그램이면 “YES"를 출력하고, 아니면 ”NO"를 출력합니다.
▣ 입력예제 1
AbaAeCe
baeeACA
▣ 출력예제 1
YES
문제풀이
import sys
sys.stdin=open("input.txt", "r")
word1=input()
word2=input()
str1=dict()
str2=dict()
for x in word1:
str1[x] = str1.get(x, 0) + 1
for x in word2:
str2[x] = str2.get(x, 0) + 1
for i in str1.keys(): #여기서 i는 인덱스가 아니라 key값임을 명심한다!!!
if i in str2.keys():
if str1[i] != str2[i]:
print("NO")
break
else:
print("NO")
break
else:
print("YES")
해설
str1[A] = str1.get('A', 0) +1
str1.get('A', 0)
"A" 키가 존재하면 해당 키에 해당하는 value를 리턴하고 없으면, value로 0을 리턴 한다.
+1은 카운팅을 의미한다.
예를 들어
알파벳 A를 키값으로 최초로 저장하는 경우에는 키A에 대한 value값이 존재하지 않으므로 딕셔너리의 get함수는 0을 리턴한다. 그리고 1이 더해진다.
요약하자면 "알파벳 A를 키값으로 최초로 저장하는 경우"에는 value값은 1이 된다.
리펙토링 코드1
import sys
sys.stdin=open("input.txt", "r")
word1=input()
word2=input()
str1=dict()
for x in word1:
str1[x] = str1.get(x, 0) + 1
for x in word2:
str1[x] = str1.get(x,0) - 1
for x in str1:
if str1.get(x)>0:
print("NO")
break
else:
print("YES")
→해설
각 알파벳 "키"에 해당하는 value값을 카운팅하고,
반대로 각 알파벳 "키"에 해당하는 value값을 -로 카운팅한다.
만약 두 문자열이 아나그램이라면 알파벳 "키"에 해당하는 value값은 전부 0이어야 한다.
리펙토링 코드2 - 아스키 코드이용
import sys
sys.stdin=open("input.txt", "r")
word1=input()
word2=input()
str1=[0]*52
str2=[0]*52
for x in word1:
if x.isupper():
str1[ord(x)-65] +=1
else:
str1[ord(x)-71] +=1
for x in word2:
if x.isupper():
str2[ord(x)-65] +=1
else:
str2[ord(x)-71] +=1
for i in range(52):
if str1[i] != str2[i]:
print("NO")
break
else:
print("YES")
보충설명 - 아스키 코드이용
str1[ord(x)-65] +=1 →알파벳 대문자의 갯수를 카운팅한다.
str1[ord(x)-71] +=1 →알파벳 소문자의 갯수를 카운팅한다
if str1[i] != str2[i]: →인덱스 i에 해당하는 알파벳의 갯수가 다르다면
▶목적
인덱스: 0 1 2 3..... 24 25
대문자: A B C D y z
인덱스 : 26 27 28 29 ....... 50 51
대문자: a b c d y z
A : 65 (아스키코드) -65 =0
B: 66 (아스키코드) - 65 =1
.
.
.
Z: 90(아스키코드) - 65=25
a: 97 (아스키코드) - 71 = 26
b:98 (아스키코드) -71 = 27
.
.
.
.
z: 122(아스키코드) - 71= 51
'파이썬 알고리즘 > 스택, 큐, 해쉬, 힙' 카테고리의 다른 글
10. 최소힙 (0) | 2022.11.06 |
---|---|
8.단어 찾기(해쉬) (0) | 2022.11.05 |
7. 교육과정 설계 (0) | 2022.11.05 |
6. 응급실 (0) | 2022.11.05 |
5. 공주 구하기(큐) (0) | 2022.11.05 |