[실버 3] 2607. 비슷한 단어 (Java)
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! (피드백 고맙습니다)