Home 에너그램 만들기 백준 1919번 배열
Post
Cancel

에너그램 만들기 백준 1919번 배열

https://www.acmicpc.net/problem/1919

문제 두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때, 그러한 두 단어를 서로 애너그램 관계에 있다고 한다. 예를 들면 occurs 라는 영어 단어와 succor 는 서로 애너그램 관계에 있는데, occurs의 각 문자들의 순서를 잘 바꾸면 succor이 되기 때문이다.

한 편, dared와 bread는 서로 애너그램 관계에 있지 않다. 하지만 dared에서 맨 앞의 d를 제거하고, bread에서 제일 앞의 b를 제거하면, ared와 read라는 서로 애너그램 관계에 있는 단어가 남게 된다.

두 개의 영어 단어가 주어졌을 때, 두 단어가 서로 애너그램 관계에 있도록 만들기 위해서 제거해야 하는 최소 개수의 문자 수를 구하는 프로그램을 작성하시오. 문자를 제거할 때에는 아무 위치에 있는 문자든지 제거할 수 있다.

굉장히 쉬운 문제였고 풀이역시 간단했으나 딱 하나. 한가지를 잘못 생각(가정)하는 바람에 애를 먹었다.

아이디어도 사실 지난번 배열 문제를 풀때와 크게 차이가 없다. 위치는 중요하지 않다. 어떤 알파벳으로 구성되어있는가가 중요하지

aabbcc, xxyybb가 있다고 가정을 하고 두 알파벳을 가정할 두가지 배열을 만든다.

그러면 첫번째 배열은

abcdefghijklmnoxyz
22200000000000000000

두번째 배열은

abcdefghijklmnoxyz
02000000000000000220

이렇게 이루어 져있을 것이다. 그러면 a부터 살펴보는 것이다.

여기서는 알파벳을 더하지 않는다 빼는 것만 존재하지

첫번째 배열과 두번째 배열의 차이는 2다. 그러면 2만큼 빼줘야 한다. b에서는 같으니 빼주지 않아도 되고 나머지 c,x,y모두 차이가 2씩 난다. 그러니 총 빼야할 알파벳의 개수는 8개가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
first = input()
second = input()

first_list = [0]*26
second_list = [0]*26

for i in range(len(first)):
    first_list[ord(first[i])-97]+=1
    
for j in range(len(second)):
    second_list[ord(second[j])-97]+=1
    
count=0
for k in range(26):
    if first_list[k] != second_list[k]:
        max_num = max(first_list[k],second_list[k])
        min_num = min(first_list[k],second_list[k])
        count += (max_num-min_num)

print(count)

내가 실수한 부분은 첫번째 for문이었는데

조건은 다음과 같다.

첫째 줄과 둘째 줄에 영어 단어가 소문자로 주어진다. 각각의 길이는 1,000자를 넘지 않으며, 적어도 한 글자로 이루어진 단어가 주어진다.

영어 소문자로 주어지고 적어도 한글자 이상이라고 했는데 두 영어단어의 길이가 같다는 조건이 없다. 그런데 나는 예시로 같은 길이만 나와서 같은거라고 생각을 하고 첫번째 for문에 모든 알파벳을 처리할려고하니 두 단어의 길이가 달라서 인덱스 에러가 났다. 따로 분리하니 통과된다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.