동명이인 찾기 알고리즘

이름들을 원소로 가진 리스트에서 동명이인들만을 찾아서 집합에 저장하는 알고리즘

{TOM, JERRY, JAKE, JILL, TOM} 이라는 원소들이 있다고 할 때 첫 번째 원소부터 뒤의 원소들을 차례대로 자신과 맞는지 검사한다.

TOM -> JERRY TOM -> JAKE TOM -> JILL TOM -> TOM

이후 동명이인인 TOM을 결과에 저장하고 그 다음 원소인 JERRY부터 검사한다

JERRY -> JAKE JERRY -> JILL JERRY -> TOM

그 다음

JAKE -> JILL JAKE -> TOM

그 다음

JILL -> TOM

이 때 마지막 원소인 TOM은 모든 원소들과 검사를 했기 때문에 굳이 검사를 하지 않는다.

1번째 원소 -> 검사 n-1번 2번째 원소 -> 검사 n-2번 . . . n번째 원소 -> 검사 n-n번

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import random


def samename(names):
    num = len(names)  # 리스트 개수를 r에 저장
    print("리스트 개수 : {}".format(num))

    result = set()  # 결과를 집합(set)으로 저장함

    for i in range(0, num - 1):  # 동명이인을 처리하는 for문
        for j in range(i + 1, num):
            if names[i] == names[j]:
                result.add(names[i])
    return result


def main():
    names = ["Tom", "Jerry", "Jake", "Parin", "Jerry", "Tom", "Jill", "Zoi"]
    print(samename(names))


if __name__ == "__main__":
    main()
1
2
3
4
    for i in range(0, num - 1):  # 동명이인을 처리하는 for문
        for j in range(i + 1, num):
            if names[i] == names[j]:
                result.add(names[i])

에서 for i in range(0, num -1)은 원소를 첫 번째부터 n-1번째(마지막 바로 전)까지 검사하겠다는 것이고

for j in range(i+1, num)은 첫 번째 원소(i)의 다음 번째(i+1)부터 마지막 원소(num)까지 검사하겠다는 것이다.

시간복잡도

빅오표기법으로 나타내면 O($n^2$) 이 된다.

이전의 포스팅에서 1+2+3+…+n 의 합은 $sqrt{n^2/3}$

댓글남기기