2607 비슷한 단어
본문 바로가기
알고리즘 모음집/New 알고리즘

2607 비슷한 단어

by KyeongMin 2021. 3. 8.
728x90
반응형
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
int A[27];//첫번째 주어지는 단어
int B[27];//비교할 단어 를 저장할 배열
int N;//비교한 단어 수 
int ret;//결과값 
string s1;//입력된 단어		
string s2;//다음 입력되는 문자열
void init() {//초기화 및 초기 입력
	N = ret=0;
	s1.clear(); s2.clear();
	memset(A, 0, sizeof(A));
	memset(B, 0, sizeof(B));
	scanf("%d", &N);
	cin >> s1;
	for (int i = 0; i < s1.size(); i++) {//단어별 체크
		A[s1[i] - 'A'] = 1;
	}
}
int one() {//그냥 비교
	int cnt = 0;//맞는 지 확인하기
	int visit[101] = { 0, };//체크
	for (int i = 0; i <s2.size(); i++) {
		for (int j = 0; j < s1.size(); j++) {
			if (s2[i] == s1[j]&&visit[j]==0) {
				cnt++; visit[j] = 1;
				break;
			}
		}
	}
	if (cnt == s2.size()) {
		ret++;//비슷한 단어 확인
		return true;
	}
	return false;
}
void two() {//한문자 추가해서 비교
	for (int i = 0; i < 27; i++) {
		s1.push_back(i + 'A');
		if (one()) {//한번만 맞는지 확인하면 되니까 1번만 하게 
			s1.pop_back();
			break;
		}
		s1.pop_back();
	}
}
void tree() {//한문자빼서 비교
	for (int i = 0; i < s1.size(); i++) {
		char cChar;//문자 저장
		cChar = s1[i];
		s1.erase(s1.begin() + i);//제거
		if (one()) {//한번만 맞는지 확인하면 되니까 1번만 하게 
			s1.insert(s1.begin() + i, cChar);//다시 삽입
			break;
		}
		s1.insert(s1.begin()+i,cChar);//다시 삽입
	}
}
void four() {//특정문자열 변경하고 탐색
	for (int j = 0; j < 27; j++) {
		for (int i = 0; i < s1.size(); i++) {
			char cChar;//문자 저장
			cChar = s1[i];
			s1[i] = j + 'A';
				if (one()) {//한번만 맞는지 확인하면 되니까 1번만 하게 
					s1[i] = cChar;
					break;
				}
				s1[i] = cChar;//다시 복구
		}
	}
}
void search() {//탐색 시작
	for (int i = 0; i < N - 1; i++) {
		cin >> s2;
		int s1Len = s1.size(); int s2Len = s2.size();
		// 같은 길이인 경우 1, 4
		if (s1Len == s2Len) {
			//1. 그냥 비교
			if (one() == 1)continue;
			//4. 한문자 바꿔서 비교
			four();
		}
		// 길이보다 작은 경우 3 (차이가 1)
		else if (s1Len - s2Len == 1) {
			//3. 한문자 빼서 비교
			tree();
		}
		// 길이 보다 큰 경우 2 (차이가 1)
		else if (s2Len - s1Len == 1) {
			//2. 한문자 추가 해서 비교 
			two();
		}
	}
}
int main(void) {
	init();
	search();
	cout << ret << endl;
	return 0;
}

진짜 무조건 설계가 중요합니다. 예전에 못풀어서 포기한 문제인데 드디어 풀었네요. 못풀줄 알고 걱정했는데 

풀어서 다행...힘내세요 다 됩니다. 

 

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

14503 로봇 청소기  (0) 2021.03.15
14499 주사위 굴리기  (0) 2021.03.15
10971 외판원 순회 2  (0) 2021.03.05
6064 카잉달력  (0) 2021.03.04
2632 피자 판매  (0) 2021.03.03

댓글