알고리즘/백준

[BaekJoon] 백준 2607번 _ 비슷한 단어 for JAVA

정석이 2023. 6. 5. 23:15

 

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

 

2607번: 비슷한 단어

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

www.acmicpc.net

 

 

문제

 

 


 

내가 푼 방법은 원본 DOG를 HashMap에 <알파벳, 알파벳개수> 로 넣어놓고

 

다른 문자열을 비교할 때마다 clone해서 사용하는 방법이다.

 

 

비교 단어가 최대 100개이고 단어 길이도 최대 10이라서 가능함!

 

 

주의할 점은 비교 문자열의 알파벳을 원본 문자열 알파벳에서 개수를 빼주고

 

원본 문자열에 남은 문자열이 있는지도 체크해줘야함.

 

 

조건

 

하나의 문자를

1. 더하거나

2. 빼거나

3. 바꾼다

 

체크 잘하기!

 

 

 

 

코드

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		String original = br.readLine();
		HashMap<Character, Integer> originalMap = new HashMap<>();
		for(int i=0; i<original.length(); i++) {
			char key = original.charAt(i);
			int value = originalMap.getOrDefault(key, 0);
			originalMap.put(key, value+1);
		}
		
		int answer = 0;
		for(int i=0; i<T-1; i++) {
			// original map clone
			HashMap<Character, Integer> compareMap = new HashMap<>();
			for(Character key : originalMap.keySet()) {
				compareMap.put(key, originalMap.get(key));
			}
			
			int cnt = 0; // 현재 알파벳이 원본에 없을 경우 +1
			int cnt2 = 0; // 현재 알파벳을 다 제했는데 원본에는 글자가 남아있을 경우 +1
			
			// check
			// 현재 알파벳을 원본에서 뺀다.
			String checkStr = br.readLine();
			for(int c=0; c<checkStr.length(); c++) {
				char key = checkStr.charAt(c);
				Integer value = compareMap.get(key);
				
				if(value == null || value == 0) {
					cnt += 1;
				} else {
					compareMap.put(key, value-1);
				}
				
				if(cnt > 1) {
					break;
				}
			}
			
			// 원본에 글자가 남아있음 (=두 단어가 같은 구성이 아닌경우)
			for(Character key : compareMap.keySet()) {
				if(compareMap.get(key) >= 1) cnt2+=1;
			}

			// cnt, cnt2가 각각 00,01,10,11인 경우만 정답 가능
			if((cnt+cnt2 <= 1) || cnt==1&&cnt2==1) {
				answer += 1;
			}
		}
		
		System.out.println(answer);
	}
}

 

 

성능

 

 

 

쓸데없이 조금 어렵게 푼듯.. 그리고 변수명 뭐할지 생각이 안나서 그냥 cnt, cnt2라고 했다. ㅠ ㅠ

 

 

그냥 배열에 'A'면 0번째에 +1, 'B'면 1번째에 +1 ... 이렇게 체크해놓고

 

1차원 배열이니까 그냥 clone() 메소드 써서 비교 문자열 알파벳 체크하는게 나을 것 같다.