※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버 3] 2607. 비슷한 단어 (Java)

J 크 2023. 8. 7. 15:18
728x90
반응형

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

 

2607번: 비슷한 단어

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

www.acmicpc.net

프론트 엔드도 재미있네용


※  문제를 요약하면 아래와 같습니다.

 비슷한 단어 찾기

 비슷한 단어는 2가지의 형태로 존재

1. 두 개의 단어가 같은 문자의 종류로 이루어져 있으면 비슷한 단어

  ( ex-  GOD, DOG 등)

위와 같은 상태를 같은 구성을 갖는 두 단어로 표현

2. 한 단어에서 한 문자를 더하거나, 빼거나, 하나의 문자를 다른 문자로 바꾸어 같은 구성을 가지면 비슷한 단어

  ( ex-  GOD, GOOD or LIM, SLIM 등)

 입력은 첫째 줄에 단어의 개수가 주어지고 두번째 줄에는 기준이 되는 단어가 주어짐

세번째 줄부터, 두번째 줄의 단어와 비교하여 비슷한 단어인지 비교 ( 모든 단어는 대문자 )

 출력은 두번째 줄에 입력된 단어와 비슷한 단어의 갯수 출력

◈ Input

4
DOG
GOD
GOOD
DOLL

◈ Output

2

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

 ASCII 코드를 활용하여 두번째 줄에 입력된 기준이 되는 단어에 나온 각 문자의 갯수를 저장

 중복된 단어를 대비하여 boolean 형태의 배열이 아닌 int 형태의 배열로 문자의 갯수를 저장

두개의 단어를 비교할 때 단어의 길이가 2이상 차이날 경우 비슷한 단어 X

▶ 두개의 단어 길이가 같은 경우 단어가 모두 일치하거나 한가지만 불일치하면 비슷한 단어

    ex) DOG, GOD  - 모든 단어가 일치 / GOD GOT 단어 하나 불일치 하지만 비슷한 단어 

기준 단어의 길이가 1개 많을 경우 비교 하는 단어가 모두 사용되어야 비슷한 단어

    ex) GOOD (기준 단어), GOD (비교 단어)  / G,O,D + O 

비교하는 단어의 길이가 1개 많을 경우 기준 단어가 모두 사용되어야 비슷한 단어

    ex) GOD (기준 단어), GOOD (비교 단어)  / G,O,D + O 

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


public class Main{

	public static void main(String[] args) throws IOException  {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		int nWords = Integer.parseInt(bf.readLine());
		
		String strFirstWord = bf.readLine();

		int nSimilarCount = 0;
		for(int i = 0 ; i < nWords-1; i++) {
			String strWord = bf.readLine();
			int[] narrASCII = new int[26];
			
			// A=65~ Z=90까지
			for(int j = 0; j < strFirstWord.length(); j++) {
				narrASCII[(int)strFirstWord.charAt(j) - 65]++;
			}
			// 기준 문자열 길이 보다 2개이상 크거나 작으면 리턴.
			if(strWord.length() < strFirstWord.length()-1 || strWord.length() > strFirstWord.length()+1)
				continue;
			
			// 1. 같은 단어 있을 경우 카운트
			int nMatchCount = 0;
			// 몇 개인지 카운트
			for(int j = 0; j < strWord.length(); j++) {
				if(narrASCII[(int)strWord.charAt(j) - 65] > 0) {
					nMatchCount++;
					narrASCII[(int)strWord.charAt(j) - 65]--;
				}
			}
			
			// 단어가 같을 경우, 기본단어가 클 경우, 입력된 단어가 클 경우
			if(strWord.length() == strFirstWord.length()
					&& (nMatchCount == strFirstWord.length()-1 || nMatchCount == strFirstWord.length())) {
				nSimilarCount++;
			} else if(strWord.length() < strFirstWord.length()
					&& nMatchCount == strWord.length()) {
				nSimilarCount++;
			} else if(strWord.length() > strFirstWord.length()
					&& nMatchCount == strFirstWord.length()){
				nSimilarCount++;
			}
			
		}
		
		System.out.println(nSimilarCount);
	}
}

 

읽어주셔서 감사합니다!

Good Luck! (피드백 고맙습니다)