반응형
문제설명
아나그램이란, 두 문자열이 알파벳의 나열 순서는 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 한다. 예를 들어, AbaAeCe 와 baeeACA 는 알파벳의 나열 순서는 다르지만 그 구성을 살펴보면 A(2개), a(1개), b(1개), C(1개), e(2개)로 알파벳과 그 개수가 모두 일치한다. 즉, 어느 한 단어를 재배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 한다. 길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성해라. 아나그램 판별 시 대소문자가 구분된다.
입력조건
- 첫 줄에 첫 번째 단어가 입력되고 둘째 줄에 두 번째 단어가 입력된다.
- 단어의 길이는 100을 넘지 않는다.
출력조건
- 두 단어가 아나그램이면 'YES' 출력하고, 아니면 'NO'를 출력한다.
사고과정
- Counter 라이브러리를 활용해서 딕셔너리 해쉬를 만드는 방법으로 풀이했다.
- 또 순수한 딕셔너리 해쉬를 활용한 풀이도 있었고 리스트 해쉬를 활용한 풀이도 있다.
- 딕셔너리에서 새로운 문법을 배웠다. 딕셔너리 key, value 값이 초기화되어있지 않았을 때 get 메소드를 사용해서 지정할 수 있는데, dict.get(key, val) 하게 되면 해당 dict(딕셔너리)에 key에 매핑되는 값이 없다면 val 이라는 값으로 생성하라는 의미이다! 이럼으로써 딕셔너리 초기화가 훨씬 편해진다!
풀이
- 나의 풀이
from collections import Counter
first = list(input())
second = list(input())
first = Counter(first)
second = Counter(second)
for k, v in first.items():
if second.get(k) is None:
print('NO')
break
if v != second.get(k):
print('NO')
break
else:
print('YES')
- 딕셔너리 해쉬 사용
# 딕셔너리 해쉬 개선된 방법
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:
# 첫번째 문자열을 key로 하는 value값이 0보다 크면 두번쨰 문자열에선 해당 단어를 사용하지 않은 셈!
if sH.get(x) > 0:
print('NO')
break
else:
print('YES')
- 리스트 해쉬와 아스키 코드 사용
# 리스트 해쉬로 풀이 -> 아스키 코드 활용
# 대문자 A는 65 Z는 90, 소문자 a는 97, z는 122
a = input()
b = input()
str1 = [0] * 52 # 소문자a부터 대문자Z까지
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
# str1 == str2 해도되긴 함
for i in range(52):
if str1[i] != str2[i]:
print('NO')
break
else:
print('YES')
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[인프런] 부분집합 구하기 (0) | 2021.11.22 |
---|---|
[인프런] 재귀함수를 이용한 이진수 출력 (0) | 2021.11.22 |
[인프런] 단어 찾기 (0) | 2021.11.17 |
[인프런] 교육과정 설계 (0) | 2021.11.17 |
[인프런] 응급실 (0) | 2021.11.17 |