The Way

백준 2607번: 비슷한 단어 본문

PS/백준 온라인 저지

백준 2607번: 비슷한 단어

Jeonggyun 2018. 1. 12. 16:15

백준 온라인 저지(BOJ) 2607번 문제

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



1. 문제 요약

두 단어가 같은 문자로 이루어져 있고, 각 문자별로 갯수가 같으면 두 단어를 '같은 구성을 갖는다'고 한다.

한 단어에서 한 문자를 추가or삭제or다른 문자로 바꾸었을 때 구성이 같아지면 두 단어는 '비슷하다'고 한다. (같은 구성을 갖는 것은 비슷한 것에 포함된다.)

첫 번째 단어와 비슷한 단어가 총 몇 개인지 출력하라.



2. 알고리즘

뭔가 복잡하게 짠 기분이 들지만,

각 알파벳별로 갯수를 세고


차이가 2 이상인 것이 있을 경우 X

갯수가 차이나는 것이 3개 이상인 경우 X

갯수가 차이나는 것이 2개인 경우 서로 바뀐 것이면 O, 아니면 X


를 통해 판별하였다.



3. 코드

#include <iostream>
using namespace std;

bool sim(int* a, int* b) {
	int s = 0, first = -1;
	for (int i = 0; i < 26; ++i) {
		if (a[i] != b[i]) {
			if (first == -1) first = i;
			if (a[i] - b[i] > 1 || a[i] - b[i] < -1) return false;
			else {
				++s;
				if (s == 2) if ((a[first] + a[i]) != (b[first] + b[i])) return false;
				if (s >= 3) return false;
			}
		}
	}
	return true;
}

int main() {
	int n, i, count = 0;
	char ori[15];
	char buf[15];
	int c1[26] = { 0 };

	scanf("%d", &n);
	scanf("%s", ori);
	i = 0;
	while (ori[i]) ++c1[ori[i++] - 'A'];
	for (int j = 1; j < n; ++j) {
		scanf("%s", buf);
		int c2[26] = { 0 };
		i = 0;
		while (buf[i]) ++c2[buf[i++] - 'A'];
		if (sim(c1, c2)) count++;
	}
	printf("%d\n", count);
	return 0;
}


'PS > 백준 온라인 저지' 카테고리의 다른 글

백준 3046번: R2  (0) 2018.01.18
백준 1712번: 손익분기점  (5) 2018.01.18
백준 14924번: 폰 노이만과 파리  (0) 2018.01.10
백준 2721번: 삼각수의 합  (0) 2018.01.10
백준 1131번: 숫자  (0) 2018.01.10
Comments