백준[1919] 애너그램 (Java) {상세 알고리즘}

2023. 3. 30. 02:49백준문제풀이

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

 

두 단어를 애너그램으로 만들기위해 제거해야하는 문자의 최소개수
 애너그램 : 단어의 구성 (알파벳과 그 개수 ) 이 완전히 같은 단어

 


1.의사코드:  없애야하는 문자 =  공통문자 제외 전부
2.각  2개의 문자열(배열로선언)의 갯수를 비교,  공통부분제외,
3.각단어의 알파벳 카운트 각배열의 길이만큼  입력한 소문자의 갯수를 [a.charAt(i)   - 'a'] 연산하면서 각배열에 들어있는 각알파벳의 수를카운트

4.이후 알파벳의 길이만큼   첫번째 문자열과 두번째문자열을 각각비교 (경우의 수를 계산하기위함)
5.경우를 나눠서 출력

 

 

 

import java.util.Scanner;

public class Practice2 {

    public static void main(String[] args) {

    //문자열 입력
 Scanner sc  = new Scanner(System.in);
// 입력받게될것 : 정수= > int

        String  a = sc.next();
        String  b=  sc.next();

        int []  Acount = new int [26];//알파벳26개
        int []  Bcount  = new int [26];

//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
    int ans = 0;
    for(int i = 0; i < a.length(); i++){  //입력받은 것의 길이만큼 영어소문자를 카운트

        Acount[a.charAt(i) -'a']++;
        }                                       // 입력받은배열 인덱스에서 a 를빼게되면 소문자 아스키코드범위내의 문자가 됨
                                                // 그 문자의 갯수를 카운트 ++

    for(int  i = 0; i <b.length(); i++){

        Bcount[b.charAt(i)-'a']++;

            }

 

 

 

//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
//구한값을 토대로 ans 값을 어떻게 출력할것인가 ? =
//        ans = Acount가(첫번째입력받은값)이 클수도있고 Bcount가(두번째입력받은값) 클수도있다 두개의 경우를 나눠서 출력 해야함
//   =>  첫번째문자배열>   두번째문자배열보다 크다면 ,뺀값을 추출, 정답 ++
//   =>  두번째문자배열<   첫번째문자배열보다 크다면, 뺸값을 추출, 정답 ++


for(int i = 0; i<26;i++){  //i<26 인이유  받게될  전체 배열의크기 : 26

if(Acount[i]> Bcount[i]){

         ans+= Acount[i] - Bcount[i];

                    }

         if (Acount[i] < Bcount[i]) {

        ans+= Bcount[i] - Acount[i];

                }

            }
        System.out.println(ans);
        }

    }