코딩테스트[파이썬]/알고리즘 문제풀이 입문

[스택&큐&해쉬] - Anagram(아나그램)

softmoca__ 2024. 2. 10. 00:50
목차

Anagram(아나그램)

 

Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아 나그램이라고 합니다.
예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치합니다.

즉 어느 한 단어를 재 배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다.

길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세 요.

아나그램 판별시 대소문자가 구분됩니다.

입력설명
첫 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력됩니다. 단어의 길이는 100을 넘지 않습니다.

출력설명

두 단어가 아나그램이면 “YES"를 출력하고, 아니면 ”NO"를 출력합니다.

 

입력예제 1

AbaAeCe

baeeACA

출력예제 1

YES

 

 

나의 코드

from collections import defaultdict

arr1=list(input())
arr2=list(input())
dic=defaultdict(int)

for x in arr1:
    dic[x]=1

for x in arr2:
    dic[x]=0

for x,y in dic.items():
    if y==1:
        print("No")
        break
else:
    print("YES")

들어온 입력을 키로 가지는 딕셔너리를 1로 체크하고 다음 입력 또한 들어온 입력을 0으로 체크한다.

그 후 딕셔너리의 값중 1이 있으면 No 없으면 Yes출력

 

+) dic=defaultdict(int) 에서 원래 같은 단어가 두번이상 들어오는지 인지를 못하고 int를 안넣고 작성을 했었다.

그럼 반례가 수많이 존재하는 잘못된 코드가 되므로 기본 값을0으로 넣어주는 int를 옵션에 넣었다

 

정답코드 1

import sys # 딕셔너리
sys.stdin=open("input.txt", "r")
a=input()
b=input()
str1=dict()
str2=dict()
for x in a:
    str1[x]=str1.get(x, 0)+1
for x in b:
    str2[x]=str2.get(x, 0)+1

for i in str1.keys():
    if i in str2.keys():
        if str1[i]!=str2[i]:
            print("NO")
            break
    else:
        print("NO")
        break
else:
    print("YES")

 

 

정답코드 2

# <딕셔너리 개선된 코드>
import sys
#sys.stdin=open("in1.txt", "r")
a=input()
b=input()
sH=dict()
for x in a:
    sH[x]=sH.get(x, 0)+1
for x in b:
    sH[x]=sH.get(x, 0)-1

for x in a:
    if(sH.get(x)>0):
        print("NO")
        break;
else:
    print("YES")

 

x 라는 키 값이 없으면 0을 리턴 있으면 해당 값을 리턴 !

 

 

정답코드 3

import sys# 리스트
sys.stdin=open("input.txt", "r")
a=input()
b=input()
str1=[0]*52
str2=[0]*52
for x in a:
    if x.isupper():
        str1[ord(x)-65]+=1
    else:
        str1[ord(x)-71]+=1
for x in b:
    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")

 

아스키 숫자를 활동해서 구현 

str들의 인덱스를 52개로 한 이유는 알파벳은 총 26개이며 대/소문자를 위해 2배 !

 

대문자 A는 65~

소문자 a는 97~       ( 97-71 =26) 번 부터 소문자 인덱스 저장