[알고리즘] 아나그램 (Hash)

(문제) 아나그램


Anagram이란 두 문자열이 알파벳의 나열 순서는 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 한다.

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

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

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

입력설명

첫 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력된다.

단어의 길이는 100을 넘지 않다.

출력설명

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

테스트케이스

입력예제 출력예제
AbaAeCe
baeeACA
YES
ADFHTWXenq
AXenqWDFHT
YES
ABCDEGHKNOPQRUWXbcdfghikotuwxy
XbCdfGhiNoPuwUyABcDEgHKkOtQRxW
YES
ABCDqtqtqEFqGHIJKLMNOPQRSTUVWetagdgXYabcdefghijklmnopqrstuwxyz
aBcdewrqwtqFghIJklMnOpqrsTuegagaeVxyYAbCDEfGHijKLmNoPQRStUwWXz
NO

해결방법

  • 문자열을 받아서 반복문으로 문자열을 순회시켜 p라는 딕셔너리를 생성하여 해당 딕셔너리안에 문자가 key값으로 가지고 있는지를 판단한다.
  • 만약 없을 경우 해당 문자를 key값으로 설정 후, value는 1로 설정한다.
  • 만약 있을 경우 해당 문자의 key값 value를 +1 시킨다.
  • 그 후, 두번째 문자열을 받아 반복문으로 문자열을 순회시켜 p의 key 값과 연결 시켜 만약 받은 문자가 key값으로 없으면 NO를 출력한다.
  • 있을 경우 해당 key값의 value를 -1 시켜서 전부 0이 되도록 만든다.
  • 만약 0 보다 작아지면 해당 문자는 아나그램이 아니기 때문에 NO를 출력한다.
  • 모든 key값의 value가 0일 경우 해당 글자는 아나그램이기 때문에 YES를 출력한다.

코드

p = dict()

for x in input():
    if x in p.keys():
        p[x] = p[x] + 1
    else:
        p[x] = 1

for y in input():
    if y in p.keys():
        p[y] = p[y] - 1
        if p[y] < 0:
            print("NO")
            break
    else:
        print("NO")
        break
else:
    if any(list(p.values())):
        print("NO")
    else:
        print("YES")

댓글남기기