[BOJ][C++] 백준 1411번 비슷한 단어

Updated:

1411번 비슷한 단어

1. 문제 정보

백준 온라인 저지 [1411번 비슷한 단어] 문제의 링크입니다.

문제

만약 어떤 단어A를 숌스럽게 바꿔서 또다른 단어 B로 만든다면, 그 단어는 비슷한 단어라고 한다.
어떤 단어를 숌스럽게 바꾼다는 말은 단어 A에 등장하는 모든 알파벳을 다른 알파벳으로 바꾼다는 소리다. 그리고, 단어에 등장하는 알파벳의 순서는 바뀌지 않는다. 두 개의 다른 알파벳을 하나의 알파벳으로 바꿀 수 없지만, 자기 자신으로 바꾸는 것은 가능하다.
예를 들어, 단어 abca와 zbxz는 비슷하다. 그 이유는 a를 z로 바꾸고, b는 그대로 b, c를 x로 바꾸면, abca가 zbxz가된다.
단어가 여러 개 주어졌을 때, 몇 개의 쌍이 비슷한지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에 한 줄에 하나씩 단어가 주어진다. 단어의 길이는 최대 50이고, N은 100보다 작거나 같은 자연수이다. 각각의 단어는 모두 다르다.

출력

첫째 줄에 총 몇 개의 쌍이 비슷한지 출력한다.

예제 입력1

5
aa
ab
bb
cc
cd

예제 출력1

4

시간 / 메모리 제한

2초 / 128MB


2. 생각

1.다른 분의 코드를 참고하여 어렵게 푼 문제였습니다. 하지만 방법을 알고 나면 어렵지 않습니다.

  1. 비슷한 단어의 쌍을 찾는 문제입니다. 문자를 바꿀 때 어떤 문자로 바꾸었는지 표시해두는 방법을 사용합니다. 만약 0이라면 문자를 바꾸지 않았다는 뜻이고, 다른 숫자라면 그 숫자에 해당하는 문자로 바꾼 것입니다.

ex1) 비슷한 단어인 경우 abca - zbxz

  k=1 2 3 4
word[i] a b c a
word[j] z b x z

1) k=1일 때, 비교 문자는 a와 z입니다.

  1 2 3 24 25 26
visited1 0 -> 26 0 0 0 0 0
visited2 0 0 0 0 0 0 -> 1
  • visited11와 visited226은 0이므로 아직 방문하지 않았습니다.
  • visited1[1]은 z로 바꿨다는 표시(26)를 하고, visited2[26]은 a로 바꿨다는 표시(1)를 합니다.

k=2일 때, 비교 문자는 b와 b입니다.

  1 2 3 24 25 26
visited1 26 0 -> 2 0 0 0 0
visited2 0 0 -> 2 0 0 0 1
  • visited12와 visited22은 0이므로 아직 방문하지 않았습니다.
  • visited1[2]은 b로 바꿨다는 표시(2)를 하고, visited2[2]은 b로 바꿨다는 표시(2)를 합니다.

k=3일 때, 비교 문자는 c와 x입니다.

  1 2 3 24 25 26
visited1 26 2 0 -> 24 0 0 0
visited2 0 2 0 0 -> 3 0 1
  • visited13와 visited224은 0이므로 아직 방문하지 않았습니다.
  • visited1[3]은 x로 바꿨다는 표시(24)를 하고, visited2[24]은 b로 바꿨다는 표시(3)를 합니다.

k=4일 때, 비교문자는 a와 z입니다.

  1 2 3 24 25 26
visited1 26 2 24 0 0 0
visited2 0 2 0 3 0 1
  • visited[1]이 0이 아니고 이미 z로 바꿨다는 표시(26)가 있습니다.
  • 이미 바꾼 값이(z) 지금 바꾸려고 하는 값(z)와 같기 때문에 문제 없습니다.

따라서, 단어 abca와 zbxz는 비슷한 단어입니다.

ex2) 비슷한 단어가 아닌 경우 aa - ab

  k=1 2
word[i] a a
word[j] a b

k=1일 때, 비교 문자는 a와 a입니다.

  1 2 26
visited1 0 -> 1 0 0
visited2 0 -> 1 0 0
  • visited11와 visited21은 0이므로 아직 방문하지 않았습니다.
  • visited1[1]은 a로 바꿨다는 표시(1)를 하고, visited2[1]은 a로 바꿨다는 표시(1)를 합니다.

k=2일 때, 비교문자는 a와 b입니다.

  1 2 26
visited1 1 0 0
visited2 1 0 0
  • visited[1]이 0이 아니고 이미 a로 바꿨다는 표시(1)가 있습니다.
  • 이미 바꾼 값이(a) 지금 바꾸려고 하는 값(b)와 같지 않기 때문에 이 경우 비슷한 단어가 아닙니다.

따라서 단어 aa와 단어 ab는 비슷한 문자열이 아닙니다.


3. 소스코드 (C++)


터미널의 입출력 화면 예제1

1411_1

터미널의 입출력 화면 문제에서 주어진 예제

1411_2 1411_3