알고리즘 문제풀이/백준

#2607 : 비슷한 단어

모항 2022. 3. 2. 15:14

풀이방법

2022.03.02

기준이 되는 문자열의 알파벳별 개수를 센다.

길이가 26인 정수 배열 arr1을 선언하여,

arr1[0]에는 A의 개수를, arr1[1]에는 B의 개수를... arr1[25]에는 Z의 개수를 저장하는 방식으로 세면 된다.

 

그 다음 문자열부터 다음의 과정을 거친다.

1. 기준문자열의 알파벳별 개수를 셌던 것과 같은 방식으로, 문자열의 알파벳별 개수를 세어 arr2에 저장한다.

2. int[] gap을 선언한다. gap[i] = arr1[i] - arr2[i]이다.

3. gap[0]~gap[25]를 점검한다.

   2 이상의 정수 혹은 -2 이하의 정수가 저장된 요소가 존재하면 즉시 점검을 종료하고 다음 문자열로 넘어간다.

   2개 이상의 문자를 변경해야 할 경우, 이 문자열은 비슷한 문자열이 아니기 때문이다.

   1이 저장된 요소가 있다면 해당 알파벳이 기준 문자열보다 하나 모자라다는 의미이다. less 변수를 1 증가시킨다.

   -1이 저장된 요소가 있다면 해당 알파벳이 기준 문자열보다 하나 많다는 의미이다. more 변수를 1 증가시킨다.

4. 밑줄 친 상황에 해당하는 요소가 하나도 없어 점검이 정상적으로 끝났을 경우,

   다음의 기준에 따라 비슷한 문자열인지를 판단한다.

  • more >1 인 경우 : 2가지 이상의 글자를 지워줘야 성분이 같아지므로, 비슷한 단어가 아님.
  • less > 1 인 경우 : 2가지 이상의 글자를 추가해줘야 성분이 같아지므로, 비슷한 단어가 아님.
  • more과 less가 모두 0인 경우 : 성분이 같은 단어임.
  • more == 0 && less == 1 : 글자를 하나만 추가해주면 성분이 같아지므로, 비슷한 단어임.
  • more == 1 && less == 0 : 글자를 하나만 지워주면 성분이 같아지므로, 비슷한 단어임.
  • more == 1 && less == 1 : 한 글자를 다른 글자로 바꾸어주면 성분이 같아지므로, 비슷한 단어임.

코드

Java(2022.03.02)

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

public class Main {
	
	static int n;	//단어 수
	static int[] first;	//첫 번째 단어의 알파벳 구성
	static int[] rest;	//나머지 단어의 알파벳 구성
	static int[] gap;	//두 단어의 알파벳별 개수차이
	static int more, less;	//기준 단어보다 한 개 많은 & 적은 알파벳의 가짓수
	static boolean v;	//비슷한 문자열이면 true
	static int ans;	//정답

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		n = Integer.parseInt(br.readLine());
		
		//첫 번째 문자열 읽어와 알파벳 구성을 저장
		char[] input = br.readLine().toCharArray();
		first = new int[26];
		for(char c : input) {
			first[c-'A']++;
		}
		
		//나머지 n-1개의 문자열
		ans = 0;
		for(int i = 0; i<n-1; i++) {
			//문자열 읽어와서 알파벳 구성을 저장
			char[] temp = br.readLine().toCharArray();
			rest = new int[26];
			for(char c: temp) {
				rest[c-'A']++;
			}
			
			//두 문자열의 알파벳별 개수차이
			gap = new int[26];
			for(int j = 0; j<26; j++) {
				gap[j] = first[j] - rest[j];
			}
			
			//두 문자열이 비슷한지 판단
			more = 0;
			less = 0;
			v = true;
			for(int j : gap) {
				if(j>1 || j<-1) v = false;
				if(j == -1) more++;
				if(j == 1) less++;
			}
			
			if(v) {
				if(more > 1) v = false;
				if(less > 1) v = false;
			}
			
			if(v) ans++;
			
		}
		
		//정답 출력
		System.out.print(ans);
		

	}

}

 

Java(2022.03.15, E-PPER 제출을 위한 solution 함수 형식)

	public static int solution(int n, String [] words) {
		int answer=0;

		char[] input = words[0].toCharArray();
		int[] first = new int[26];
		for(char c : input) {
			first[c-'A']++;
		}
		
		for(int i = 1; i<n; i++) {
			//문자열 읽어와서 알파벳 구성을 저장
			char[] temp = words[i].toCharArray();
			int[] rest = new int[26];
			for(char c: temp) {
				rest[c-'A']++;
			}
			
			//두 문자열의 알파벳별 개수차이
			int[] gap = new int[26];
			for(int j = 0; j<26; j++) {
				gap[j] = first[j] - rest[j];
			}
			
			//두 문자열이 비슷한지 판단
			int more = 0;
			int less = 0;
			boolean v = true;
			for(int j : gap) {
				if(j>1 || j<-1) v = false;
				if(j == -1) more++;
				if(j == 1) less++;
			}
			
			if(v) {
				if(more > 1) v = false;
				if(less > 1) v = false;
			}
			
			if(v) answer++;
			
		}
		return answer;
	}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#1431 : 시리얼 번호  (0) 2022.03.05
#3190 : 뱀  (0) 2022.03.02
#9012 : 괄호  (0) 2022.03.02
#2231 : 분해합  (0) 2022.03.02
#9237 : 이장님 초대  (0) 2022.02.24