여니의 취준 준비/코딩테스트 (Python)

[n1411] 비슷한 단어 in python

여니's 2021. 9. 29. 17:25


(풀이)

조합을 이용해서 일단 경우의 수를 먼저 뽑았다.

그리고 두 개의 리스트를 이용하여 탐색을 진행한다.

(단어 A와 단어 B가 일대일 관계여야한다는 거!)


ex) aa ab

 

A  B

a - a

다음 문자열 탐색에서 a 는 무조건 a랑 이어져야 한다.

a - b

a랑 a랑 이어져야 하는데 a랑 b랑 이어져서 

카운트는 하지 않는다.


ex) abca zbxz

A B

a - z

다음 문자열 탐색에서 a 는 무조건 z랑 이어져야 한다.

b - b

다음 문자열 탐색에서 b는 무조건 b랑 이어져야 한다.

c-x

다음 문자열 탐색에서 c 는 무조건 x랑 이어져야 한다.

a - z

a가 z랑 잘 연결되었으니까 문제 없음!

이 예시 같은 경우에는 결과값에 포함

from itertools import combinations

num = int(input())
array = []
for i in range(num):
    array.append(input())

com_arr = list(combinations(array, 2))
result = 0

for i in com_arr:
    str1, str2 = i[0], i[1]
    visit1 = [0 for _ in range(26)]  # visited1 : ord(str2[k])번째 위치에 str1[k] 요소 넣기.
    visit2 = [0 for _ in range(26)]  # visited2 : 중복체크용,
    cnt = 0

    if len(str1) == len(str2):  # 조건 1) 길이가 같다면
        for k in range(len(str1)):
            a = ord(str1[k]) - ord('a')
            b = ord(str2[k]) - ord('a')
            if not visit1[b]:  # 변환 위치에 알파벳이 비어있을 때
                if visit2[a]: # aa zb인 경우 , a->z , a->b 중복
                    break
                visit1[b] = ord(str1[k])
                visit2[a] = 1
                cnt += 1
                continue

            if visit1[b] == ord(str1[k]):
                cnt+=1
                continue
            else:
                break

    if cnt == len(str1):
        result += 1
print(result)