[문제 링크] 👇
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
1️⃣ 문자열 길이 만큼 반복문을 돌린다.
2️⃣ 문자열 중 현재 위치 전까지 슬라이싱 한 후, 현재 문자가 슬라이싱 한 리스트에 있는지 확인한다.
if s[i] not in s[:i]:
...
else:
...
- 문자 not in 리스트 : 문자가 리스트에 없으면 True 를 반환
- 문자 in 리스트 : 문자가 리스트에 있으면 True 를 반환
3️⃣ 없으면 -1을 결과 리스트에 추가하고, 있으면 문자열에서 현재 위치 이전부터 맨 앞까지 거꾸로 확인한다.
for j in s[i-1::-1]:
- 리스트[start:end:step] : step 에 -1 을 넣으면 뒤에서부터 슬라이싱을 한다.
4️⃣ 뒤에서부터 확인하면서 카운트 하고, 현재 위치와 같은 문자가 나타나면 현재 루프를 중단한다.
5️⃣ 그리고 카운트 값을 결과 리스트에 추가한다.
Solution
def solution(s):
answer = []
for i in range(len(s)):
cnt = 0
if s[i] not in s[:i]:
answer.append(-1)
else:
for j in s[i-1::-1]:
cnt += 1
if s[i] == j:
break
answer.append(cnt)
return answer
개선할 점
주어진 함수는 각 문자의 이전 등장 위치를 찾기 위해 반복문을 사용해 뒤로 거슬러 올라가면서 cnt를 증가시키고 있다. 현재 코드도 올바르게 작동하지만, s의 길이가 길어질 경우 성능상 문제가 발생할 수 있다. 이를 개선할 수 있는 방법은 이전 등장 위치를 기록해두고 바로 접근하는 방식을 사용하는 것이다.
- 각 문자의 이전 등장 위치를 기록하는 딕셔너리를 사용하여, 문자열을 한 번 순회할 때마다 바로바로 이전 등장 위치를 확인하도록 한다.
- 매 문자를 탐색할 때 해당 문자가 이전에 등장한 적이 없다면 -1을, 이전에 등장한 위치가 있다면 그 위치와 현재 위치의 차이를 계산하여 answer에 추가한다.
개선한 코드
def solution(s):
answer = []
last_seen = {} # 각 문자의 마지막 위치를 저장하는 딕셔너리
for i, char in enumerate(s):
if char in last_seen:
# 이전에 등장했다면, 현재 위치와 이전 위치의 차이를 계산
answer.append(i - last_seen[char])
else:
# 이전에 등장하지 않았다면 -1 추가
answer.append(-1)
# 현재 위치를 마지막 위치로 갱신
last_seen[char] = i
return answer
- last_seen 딕셔너리는 각 문자의 마지막 등장 위치를 저장한다.
- 각 문자의 인덱스를 순회하면서, 딕셔너리에서 이전 등장 위치를 확인하여 필요한 거리를 바로 계산할 수 있다.
- 이렇게 하면 문자열을 한 번만 순회하면서 해결할 수 있어 시간 복잡도가 O(n)으로 줄어들어 효율성이 높아진다.
'프로그래머스 코딩테스트 > Level 1' 카테고리의 다른 글
[Programmers] L1. 모의고사 (완전탐색/Python) (0) | 2024.11.06 |
---|---|
[Programmers] L1. 문자열 내 마음대로 정렬하기 (Python) (1) | 2024.11.06 |
[Programmers] L1. 삼총사 (Python) (0) | 2024.11.06 |
[Programmers] L1. 예산 (Python) (0) | 2024.10.30 |
[Programmers] L1. 크기가 작은 부분문자열 (Python) (0) | 2024.10.25 |