ALGORITHM

[JAVA] 백준 2607번- 비슷한 단어

연듀 2022. 10. 2. 15:12

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

 

2607번: 비슷한 단어

첫째 줄에는 단어의 개수가 주어지고 둘째 줄부터는 한 줄에 하나씩 단어가 주어진다. 모든 단어는 영문 알파벳 대문자로 이루어져 있다. 단어의 개수는 100개 이하이며, 각 단어의 길이는 10 이

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

public class Main{
    public static HashMap<Character, Integer> map1, map2;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n= Integer.parseInt(br.readLine());
        String word = br.readLine();
        int answer=0;


        map1 = new HashMap<>();
        map2 = new HashMap<>();

       init(map1);

        for(int i=0; i<word.length(); i++){
            char ch = word.charAt(i);
            map1.replace(ch, map1.get(ch) + 1);
        }

        for(int i=0; i<n-1; i++){
            init(map2);
            String word2 = br.readLine();

            for(int j=0; j<word2.length(); j++){
                char ch = word2.charAt(j);
                map2.replace(ch, map2.get(ch) + 1);
            }
            if(isSimilar(map2)) answer++;
        }

        System.out.println(answer);

    }

    private static void init(HashMap<Character, Integer> hm){
        for(char ch='A';ch<='Z';ch++) hm.put(ch, 0);
    }

    public static boolean isSimilar(HashMap<Character, Integer> map2){
        // 문자열 알파벳 개수 차이가 2이하
        // 문자열의 길이 차이가 1 이하
        int a, b, diff=0, word1len =0, word2len=0;
        for(char ch='A'; ch<='Z'; ch++){
             word1len+= (a = map1.get(ch));
             word2len+= (b = map2.get(ch));
             diff+=Math.abs(a-b);
        }
        return diff<=2 && Math.abs(word1len-word2len) <=1;
    }
}