coding test

문자열 - 백준 1919번 애너그램 만들기

ron_nie 2024. 3. 4. 21:54
728x90

1919번: 애너그램 만들기

접근

처음에 2차원 배열을 생각하고 접근해봤는데 각각의 알파벳들을 검사할때 마다 count가 올라갔다. 그래서 두개의 문자열을 따로 순회하면서 카운팅을 하는 방법으로 생각을 바꿔봤다.

 

애너그램 → 두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때

eg. dared ↔ bread

위의 경우 제거해야하는 최소 개수 2개 즉 공통된 단어빼고 전부 삭제하면 된다.

A: “dared” : {’a’ : 1, ‘d’ : 2, ‘e’ : 1, ‘r’ : 1}

B: “bread” : {’a’ : 1, ‘b’ : 1, ‘d’ : 1, ‘e’ : 1, ‘r’ : 1}

숫자가 공통으로 있는 단어는 카운트하지 않고 숫자가 없거나, 개수에 차이가 나는 알파벳은 카운트한다.

즉 위의 예시는 b(알파벳이 없음)과 d(갯수 차이가 남)으로 최소 두개이다.

풀이

package learnString;

import java.util.Scanner;
/*
* countA[...]++는 countA 배열의 해당 인덱스에 있는 값을 1씩 증가시킨다.
* countB도 같다.
* */

class Main
{
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();

        // 각각 단어의 알파벳 구성 구하기
        int[] countA = new int[26]; //eg. dared: [1. 0, 0, 2, ..] => abcd 기준 a는 1개 b, c 없고 d 2개
        int[] countB = new int[26];

        for (int i = 0; i < a.length(); i++) {
            // 카운트배열(강사님 명칭)
            // 1. a.charAt(i) 는 a문자열의 i번째 문자를 반환함
            // 2. -a 를 하는것은 a로부터 상대적 위치를 구하는것. 예를 들어 a는 0번째, b는 1번째, c는 2번째가 됨.
            // 3. count[...]++는 해당 알파벳 문자가 등장할 때마다 카운트를 1씩 증가시킴
            countA[a.charAt(i) - 'a']++;
        }

        // b문자열도 똑같이 구해준다.
        for (int i = 0; i < b.length(); i++) {
            countB[b.charAt(i) - 'a']++;
        }

        // 답 구하기
        int ans = 0;
        for (int i = 0; i < 26; i++) {
            if (countA[i] > countB[i]) {
                ans += countA[i] - countB[i];
            } else if (countA[i] < countB[i]) {
                ans += countB[i] - countA[i];
            }
        }
        System.out.println(ans);
    }
}

리펙토링

통과는 되지만 반복되는 기능이 많아서 리펙토링을 진행해봤다.

package learnString;

import java.util.Scanner;

class Main
{
    // 카운트 하는 부분 따로 메소드로 만들기
    public static int[] getAlphabetCount(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 a = sc.next();
        String b = sc.next();

        int[] countA = getAlphabetCount(a);
        int[] countB = getAlphabetCount(b);

        int ans = 0;
        for (int i = 0; i < 26; i++) {
            // 대소구분을 절댓값으로 비교
            ans += Math.abs(countA[i] - countB[i]);
        }
        System.out.println(ans);
    }
}

반응형