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

 

1919번: 애너그램 만들기

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

www.acmicpc.net

 

Sol 1)

문제 조건을 보면 소문자가 주어지니까 한글자씩 비교하면서, 같은 글자가 존재하면 이를 'A'로 바꿔버린다. 

예를들어, dared와 bread라고 하면

d a r e d

b r e a d

A A A A d

b A A A A

로 바뀌게 되는 것이다. 이제 b,d 두 문자만 남으므로 2개를 제거하는 것이 답이다.

 

a a b b c c

x x y y b b 

이면,

a a A A c c 

x x y y A A

로 바뀌니까 총 8개이다.

 

코드로 작성해보면,

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.next();
        String str2 = sc.next();
        char[] char1 = str1.toCharArray();
        char[] char2 = str2.toCharArray();
        int cnt = 0;
        for (int i = 0; i < char1.length; i++) {
            for (int j = 0; j < char2.length; j++) {
                if (char1[i] == char2[j]) {
                    char1[i] = 'A';
                    char2[j] = 'A';
                }
            }
        }
        for (int i = 0; i < char1.length; i++) {
            if (char1[i] != 'A') {
                cnt++;
            }
        }
        for (int i = 0; i < char2.length; i++) {
            if (char2[i] != 'A') {
                cnt++;
            }
        }
 
        System.out.println(cnt);
    }
 
}
 
cs

 

 

Sol 2)

애너그램이라는게 결국 알파벳의 종류, 그 개수가 완전히 같은 단어이므로

각 단어에서 어떤 알파벳을 가지고 있고, 각각 몇개씩 가지고 있는지를 비교하도록 한다.

예를들어,

dared: 'a': 1, 'b': 0, 'd': 2, 'e': 1, 'r': 1 이고

bread: 'a': 1, 'b': 1, 'd': 1, 'e': 1, 'r': 1 이다.

알파벳의 종류와 그 개수가 동일하다면 제거할 필요가 없다. 즉 신경쓸 필요가 없다.

종류와 개수가 다른 경우만 체크해주면 된다.

즉, b와 d만 비교해주고, 그 개수의 차이만큼만 제거해주면 된다. (b 1개, d 1개 총 2개)

 

코드로 작성해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.next();
        String str2 = sc.next();
        
        /* 
        알파벳 카운트되는 배열만들기
        index 0 1 2 3 4 5 ... 25
        count 
        알파벳  a b c d e f ... z
        
        int[] arr = new int[26]; 에서
        어떤 단어가 bear이다?
        {1, 1, 0, 0, 1.... } 이런식으로 카운트를 표시!
        
        */
         
        int[] alphaArr1 = new int[26]; // 알파벳 개수(26개)
        for (int i = 0; i < str1.length(); i++) {
            alphaArr1[str1.charAt(i) - 'a']++;
        }
        
        int[] alphaArr2 = new int[26]; // 알파벳 개수(26개)
        for (int i = 0; i < str2.length(); i++) {
            alphaArr2[str2.charAt(i) - 'a']++;
        }
        
        int ans = 0;
        for (int i = 0; i < 26; i++) {
            if(alphaArr1[i] > alphaArr2[i]) {
                ans += alphaArr1[i] - alphaArr2[i];
            }
            else if(alphaArr1[i] < alphaArr2[i]) {
                ans += alphaArr2[i] - alphaArr1[i];
            }
        }
        
        System.out.println(ans);
        
    }
 
}
 
cs

 

위 코드에서 사용된 중요한 생각!

int[ ] arr = new int [ 26 ];을 만드는 부분

그 결과를 아래 그림처럼 생각해라

첫번째 행은 a,b,c...처럼 알파벳의 위치로 생각하는 부분

두번째 행은 초기값은 다 0이지만, 카운트가 되면 1씩 증가시키는 부분

세번째 행은 index number

 

Sol 2-1)

위 코드를 좀 더 간결하게 만들기 위해 함수를 사용해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Scanner;
 
public class Main {
 
    public static int[] get_alphabet_count(String str) {
        int[] count = new int[26];
        for (int i = 0; i < str.length(); i++) {
            count[str.charAt(i) - 'a']++;
        }
        return count;
    }
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.next();
        String str2 = sc.next();
 
        int[] alphaArr1 = get_alphabet_count(str1);
        int[] alphaArr2 = get_alphabet_count(str2);
 
        int ans = 0;
        for (int i = 0; i < 26; i++) {
            ans += Math.abs(alphaArr1[i] - alphaArr2[i]); // 차이 구하기 위해 절댓값 사용
        }
 
        System.out.println(ans);
 
    }
 
}
 
cs

+ Recent posts