[프로그래머스] Lv.1 가장 가까운 같은 글자 Python

콩이·2024년 1월 25일
0

코딩테스트 Python

목록 보기
2/13

📍 문제 설명

📍 풀이 point

1) 나는 s를 key값은 알파벳, value값은 해당 알파벳이 위치한 인덱스 위치를 넣어 딕셔너리를 만들었다.

2) 그 후 value값 길이(key값 알파벳이 몇 번 나왔는지 담겨있는 list)가 1인 항목들은 중복해서 등장하는 알파벳이 아니기 때문에 해당 value의 인덱스 값에 해당하는 위치의 값을 -1로 바꾸어주었다.

3) 그리고 value값 길이가 1보다 큰 경우에서 처음으로 나오는 인덱스 값(0번째 인덱스) 또한 중복해서 등장하는 알파벳이 아니기 때문에 해당 value의 인덱스 값에 해당하는 위치의 값을 -1로 바꾸어주었다.

4) value값 길이가 1보다 큰 경우에 2번째 인덱스부터는 중복해 등장하는 알파벳이기 때문에 해당 인덱스의 값에서 전에 등장한 인덱스의 값을 뺀 값을 저장한다.

def solution(s):
    s_dict = dict.fromkeys(s,0)
    s_list = list(s)
    
    # key값에 해당하는 알파벳이 등장하는 인덱스를 list형태로 value에 저장
    for i in s_dict.keys() :
        s_dict[i] = list(filter(lambda x: s[x] == i, range(len(s))))
    
    for j in s_dict.keys():
        if len(s_dict.get(j)) == 1:
            s_list[s_dict.get(j)[0]] = -1
        elif len(s_dict.get(j)) > 1:
            s_list[s_dict.get(j)[0]] = -1  # value list 길이가 1이 넘더라도 첫번째 인덱스는 중복된 알파벳이 아니기 때문에 해당 인덱스에 해당하는 값에도 -1 넣기
            for z in range(1,len(s_dict.get(j))):
                s_list[s_dict.get(j)[z]] = s_dict.get(j)[z] - s_dict.get(j)[z-1] 
    
    return s_list

나는 조금 복잡하게 풀이한 거 같아 다른 분들의 간결한 코드를 참고하면 좋을 거 같다.

def solution(s):

  answer = []
  di = {}

  for i in range(len(s)):
    if s[i] not in di:
      answer.append(-1)
    else:
      answer.append(i-di[s[i]])
    di[s[i]] = i

  return answer

내가 참고한 코드에서는 처음 등장하는 요소에 대하여 -1을 저장하고 그게 아니라면 이미 등장한 요소의 인덱스 값을 딕셔너리 자료형을 사용하여 저장하여 이미 등장한 요소의 경우 현재 인덱스값에서 딕셔너리에 저장된 인덱스값을 빼주는 방법을 사용하였다.

0개의 댓글