본문 바로가기
알고리즘

Algorithm - 아나그램(리스트 해쉬)

by DGK 2021. 12. 7.

 

알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

문제

[아나그램(리스트 해쉬)]

 

Anagram은 두 문자열이 알파벳의 나열 순서만 다를 뿐, 그 구성이 일치하는 것을 뜻한다.

 

예를 들면, AbaAeCe와 baeeACA는 알파벳의 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치한다. 즉, 어느 한 단어를 재배열하면 상대편 단어가 될 수 있는 것을 아나그램이라고 한다.

 

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

(단, 아나그램 판별 시 대·소문자는 구별됨)

 

 

*입력 설명

첫 번째 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력된다. (단, 단어의 길이는 100을 넘지 않음)

 

*출력 설명

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

 

 


 

 

풀이(Python)

답안

import sys
sys.stdin = open('AA/input_40.txt', 'rt')

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")
    
# 출력 : YES

 

input_40.txt(입력)

AbaAeCe
baeeACA

 

 

중요내용

  1. str1 = [0] * 52는 알파벳의 대·소문자 개수가 52개 이므로, 리스트 [0]에 52를 곱해주는 것이다. (각 알파벳 별로 인덱스 번호를 부여하여 해당 알파벳의 개수를 카운팅하기 위함)
  2. 참고로, 알파벳 대문자의 아스키 넘버는 65부터 90까지이며, 소문자의 아스키 넘버는 97부터 122까지이다. (A: 65, Z: 90, a: 97, z: 122)
  3. 알파벳 대문자의 경우는 0~25 인덱스 번호에 해쉬를 하는 것이고, 소문자의 경우에는 26~51 인덱스 번호에 해쉬를 하는 것이다.

 

 

'알고리즘' 카테고리의 다른 글

Algorithm - 최대힙  (0) 2021.12.09
Algorithm - 최소힙  (0) 2021.12.09
Algorithm - 아나그램(딕셔너리 해쉬)  (0) 2021.12.07
Algorithm - 단어 찾기(딕셔너리 해쉬)  (0) 2021.12.06
Algorithm - 교육과정 설계(큐)  (0) 2021.12.06

댓글