알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
문제
[아나그램(리스트 해쉬)]
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
중요내용
- str1 = [0] * 52는 알파벳의 대·소문자 개수가 52개 이므로, 리스트 [0]에 52를 곱해주는 것이다. (각 알파벳 별로 인덱스 번호를 부여하여 해당 알파벳의 개수를 카운팅하기 위함)
- 참고로, 알파벳 대문자의 아스키 넘버는 65부터 90까지이며, 소문자의 아스키 넘버는 97부터 122까지이다. (A: 65, Z: 90, a: 97, z: 122)
- 알파벳 대문자의 경우는 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 |
댓글