백준 1919 - 애너그램 만들기
문제
두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때, 그러한 두 단어를 서로 애너그램 관계에 있다고 한다. 예를 들면 occurs 라는 영어 단어와 succor 는 서로 애너그램 관계에 있는데, occurs의 각 문자들의 순서를 잘 바꾸면 succor이 되기 때문이다.
한편, dared와 bread는 서로 애너그램 관계에 있지 않다. 하지만 dared에서 맨 앞의 d를 제거하고, bread에서 제일 앞의 b를 제거하면, ared와 read라는 서로 애너그램 관계에 있는 단어가 남게 된다.
두 개의 영어 단어가 주어졌을 때, 두 단어가 서로 애너그램 관계에 있도록 만들기 위해서 제거해야 하는 최소 개수의 문자 수를 구하는 프로그램을 작성하시오. 문자를 제거할 때에는 아무 위치에 있는 문자든지 제거할 수 있다.
입력
첫째 줄과 둘째 줄에 영어 단어가 소문자로 주어진다. 각각의 길이는 1,000자를 넘지 않으며, 적어도 한 글자로 이루어진 단어가 주어진다.
출력
첫째 줄에 답을 출력한다.
문자열 구현 문제다. 한눈에 보기엔 쉬워 보이는데, 막상 구현하려니 고려할 게 많다.
내가 푼 코드. 각 문자열의 알파벳 개수를 각각 센 다음, 알파벳 별로 차이를 합계 내는 방법이다.
la = [0] * 26
lb = [0] * 26
a = input()
b = input()
for i in a:
la[ord(i)-97] += 1
for j in b:
lb[ord(j)-97] += 1
cnt = 0
for i in range(26):
if la[i] or lb[i]:
cnt += abs(la[i]-lb[i])
print(cnt)
더 쉬운 코드. collections
라이브러리의 Counter
함수를 쓰는 방법이다.
Counter
함수는 문자열 내 각 문자의 개수를 세어 딕셔너리로 iterable한 형태로 반환해주는 함수다. 정렬은 내림차순으로 된다.
from collections import Counter
w = "hello world"
print(Counter(w))
# {'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
Counter
함수를 이용한 풀이법. 두 문자열 속 문자 개수를 구한 다음 sum(a의 값-b의 값)+sum(b의 값-a의 값)
을 구하면 된다.
from collections import Counter
a, b = Counter(input()), Counter(input())
print(sum((a-b).values()) + sum((b-a).values()))
어떤 길이든 로마로 통하겠지만, 빠르고 편리한 신작로를 찾는 건 능력이다.
[문제 보기]