Python

[좌충우돌, 파이썬으로 자료구조 구현하기] 문자열의 가장 먼저 나오는 유일한 문자 찾기 (hashTable)

Wix 2023. 9. 11. 16:31

문제

주어진 문자열에서 반복되지 않는 문자 중 가장 먼저 나오는 문자의 인덱스를 출력하라. 모든 문자가 중복되면, -1을 출력하라.

예시

입력: leetcode, 출력: 0
입력: loveleetcode, 출력: 2
입력: aabb, 출력 -1

풀이

1. 이중 반복문 풀이

현재 문자 뒤로 같은 문자가 있는지 확인하면서 문제를 푼다.

단, 'aabb'의 경우 2번째 'a'의 경우 위 논리에 어긋나기 때문에, 이미 중복확인한 문자는 로직을 건너 뛰도록 구현해야한다.

def firstUniqueCharacter(str):
    result = [i for i in range(len(str))]
    checklist = []

    for i,s in enumerate(str):
        if s in checklist:
            continue

        for j in range(i+1,len(str)):
            k = str[j]
            if s == k:
                result[i] = -1
                break
            result[i] = i
        checklist.append(s)

        if (result[i] != -1):
            return i

    return -1
  • 각 문자열의 인덱스로 result 배열을 초기화시킨다.
  • 현재 index의 문자열을 기준 문자열로 두고 이후의 문자열과 비교하여 같은 것이 없다면 해당 문자열의 인덱스를 반환한다.
  • 기준 문자열과 비교 문자열이 같으면 해당 문자열의 result 배열의 인덱스에 -1을 할당한다.

2. 사전을 이용한 풀이

def firstUniqueByDict(str):
    count = {}
    for s in str:
        if s not in count:
            count[s] = 1
        else:
            count[s] += 1

    for i,s in enumerate(str):
        if count[s] == 1:
            return i
    return -1
  • count 사전 변수에 주어진 문자열의 각 문자를 키로 설정하고 값을 문자열 갯수로 설정한다
  • count 변수를 순회하면서 값이 1인 문자열의 인덱스를 반환하도록 구현한다.

3. 출현 빈도를 알려주는 Counter 함수 이용한 풀이

사전을 이용하여 빈도를 계산하는 사례가 많아서 파이썬 collections 모듈에 Counter 함수를 사용하면 더 간단하게 풀 수 있다.

from collections import Counter

def first_unique_char_dic2(s):
    count = Counter(s)
    for i, ch in enumerate(s):
        if count[ch] == 1:
            return i
    return -1
Counter({'e': 4, 'l': 2, 'o': 2, 'v': 1, 't': 1, 'c': 1, 'd': 1}) # count