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