문제 설명
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
- b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
- a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
- n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
- a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
- n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
- a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.
제한사항
- 1 ≤ s의 길이 ≤ 10,000
- s은 영어 소문자로만 이루어져 있습니다.
입출력 예
입출력 예 설명
입출력 예 #1
- 지문과 같습니다.
입출력 예 #2
- 설명 생략
코드
def solution(s):
answer = []
s_list = list(s)
for val, idx in zip(s_list, range(len(s_list))):
if s.index(val) == idx:
answer.append(-1)
else:
answer.append(idx-s_list.index(val))
s_list[s_list.index(val)] = ""
return answer
풀이
문자열 s를 s_list로 변환하여 s_list와 그의 길이를 zip으로 묶어 for문을 돌려준다. 만약 s_list의 있는 값이 처음으로 등장하는 인덱스번호와 for문이 돌아간 횟수가 같으면 그 문자가 처음나온 것이기 때문에 -1을 추가해주고, 그렇지 않으면 for문이 돌아간 횟수에서 val이 처음으로 등장하는 인덱스 번호를 뺀 값을 answer에 추가해준다.(나와 가장 가까이 있는 수가 몇 번째 있는지 알기 위해)
그리고 그에 대한 추가가 완료되었으면 해당 자리에 있는 것을 공백으로 초기화해준다. (index는 가장 처음에 있는 것의 자리를 반환하기 때문에 이미 완료된 것에 대해서 초기화해서 다음 것에 대한 정보를 얻기 위해)
다른 코드와 풀이
아래의 코드는 다른 사람들이 작성한 것들로, 내 코드와 비교, 참고하기 위해 가져왔다.
def solution(s):
answer = []
dic = dict()
for i in range(len(s)):
if s[i] not in dic:
answer.append(-1)
else:
answer.append(i - dic[s[i]])
dic[s[i]] = i
return answer
dict()으로 빈 dictionary를 만들어 dic에 넣어준다. 그리고 문자열 s의 길이만큼 for문을 돌려 문자열 s의 i번째 자리가 dic에 포함되어있는지 없다면 -1을 추가하고, 포함되어 있다면 i에서 dic의 value를 빼준다. 그리고 마지막으로 처리가 완료된 것에 대한 문자가 등장한 위치 i를 dic에 넣어준다.
'Coding Test' 카테고리의 다른 글
231105 개미 군단 (0) | 2023.11.05 |
---|---|
231104 K번째수 - Level 1 (0) | 2023.11.04 |
231102 숫자 문자열과 영단어 - Level 1 (1) | 2023.11.02 |
231101 시저암호 - Level 1 (1) | 2023.11.01 |
231031 크기가 작은 부분 문자열 - Level 1 (0) | 2023.10.31 |