본문 바로가기

알고리즘 설계/내가 보려고 정리하는 문풀

Anagram

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개


 

'알고리즘 설계 > 내가 보려고 정리하는 문풀' 카테고리의 다른 글

최대힙  (0) 2024.11.27
최소힙  (0) 2024.11.27
단어찾기  (0) 2024.11.25
교육과정 설계  (0) 2024.11.24
응급실  (2) 2024.11.23