Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치함
예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만
그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치함
즉, 어느 한 단어를 재 배열하면 상대편 단어가 될 수 있는 것이 아나그램.
길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램 작성
아나그램 판별시 대소문자가 구분
▣ 입력설명 첫 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력됨
▣ 출력설명 두 단어가 아나그램이면 “YES"를 출력하고, 아니면 ”NO"를 출력
▣ 입력예제
AbaAeCe
baeeACA
▣ 출력예제
YES
내가 쓴 코드1
import sys
sys.stdin = open("input.txt",'rt')
#각 알파벳 갯수 담을 딕셔너리
cnt1 = dict()
cnt2 = dict()
#두 단어 입력받기
word1 = list(input())
word2 = list(input())
#정렬 안해도 상관없음 - 딕셔너리는 순서가 중요하지 않음
# word1.sort()
# word2.sort()
for x in word1:
#이미 카운트 딕셔너리에 있는 알파벳이면 카운트 +1
if x in cnt1.keys():
cnt1[x] += 1
#없으면 카운트 = 1
else:
cnt1[x] = 1
for x in word2:
if x in cnt2.keys():
cnt2[x] += 1
else:
cnt2[x] = 1
if cnt1 == cnt2:
print("YES")
else:
print("NO")
모범답안1
#모범답안 - dictionary
import sys
sys.stdin = open("input.txt", 'rt')
a = input()
b = input()
sh = dict()
for x in a:
#sh에 x키가 있으면 그 값을 가져와서 +1
#없으면 0을 넣고 + 1
sh[x] = sh.get(x,0) + 1
for x in b:
#다른 문자열에서 나타나면 -1
#value값이 애너그램이면 다 0이어야 함
sh[x] = sh.get(x,0) - 1
for x in a:
if sh.get(x) != 0:
print("NO")
break
#딕셔너리 안에 VALUE값이 다 0: 애너그램 맞음
else:
print("YES")
내가 쓴 코드2
#나의 코드 - 리스트 이용
import sys
sys.stdin = open("input.txt",'rt')
#두 문자열 입력받기
word1 = list(input())
word2 = list(input())
#정렬
word1.sort()
word2.sort()
#정렬한거 비교
if word1 == word2:
print("YES")
else:
print("NO")
모범답안2
#모범답안 - 리스트해쉬: 아스키코드 이용
import sys
sys.stdin = open('input.txt','rt')
a = input()
b = input()
#알파벳 대문자 26개, 소문자 26개 총 52개
#알파벳 대문자 아스키코드는 65~90
#알파벳 소문자 아스키코드는 97~122
str1 = [0]*52
str2 = [0]*52
for x in a:
#문자가 대문자면
if x.isupper():
#ord함수는 문자를 아스키넘버로 변환
#대문자의 경우 65가 0이 되어야 함
str1[ord(x)-65] += 1
#문자가 소문자면
else:
#아스키코드 97이 26이 되어야 함
str1[ord(x)-71] += 1
for x in b:
if x.isupper():
str2[ord(x)-65] += 1
else:
str2[ord(x)-71] += 1
# if str1 == str2:
# print("YES")
# else:
# print("NO")
for i in range(52):
if str1[i] != str2[i]:
print("NO")
break
else:
print("YES")
느낀점
1. easy했다. 알아야 될 점은 딕셔너리의 키 순서는 중요하지 않다는 것.
키와 해당값이 모두 동일하면 순서가 달라도 두 딕셔너리는 같다고 간주된다.
2. 리스트 사용한게 더 간단해 보이는데 .. 문자열의 길이가 길어질수록 dict 사용하는 코드가
더 효율적이 되는듯하다.
3. ord함수는 문자를 아스키코드로 변환함
알파벳 대문자는 65~90 총 26개
알파벳 소문자는 97~122 총 26개