프로그래머스-코딩테스트/Lv.1

가장 가까운 같은 글자

stem_sw 2024. 9. 9. 10:41
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제


문자열 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을 완성해주세요.

 

 

 

 

코드


def solution(s):
    ind_dict = {}
    answer = []
    for i in range(len(s)):
        if s[i] not in ind_dict:
            answer.append(-1)
            ind_dict[s[i]] = i
        else:
            answer.append(i - ind_dict[s[i]])
            ind_dict[s[i]] = i
        
    return answer
  • ind_dict 라는 딕셔너리에 가장 최근에 나온 문자 인덱스를 저장
  • 문자 호출때마다 비교. 첫 등장은 -1로

 

 

 

노트


정확한 사용법 기억하기

.pop(index)
.index('a')

 

 

 

def solution(s):
    ind_dict = {}
    answer = []
    for i in range(len(s)):
        ind_dict[s[i]] = list(filter(lambda x: s[x]==s[i], range(len(s))))


    def calc_diff(lst):
        result = [-1]
        for i in range(1, len(lst)):
            result.append(lst[i] - lst[i-1])
        return result


    result_dict = {key: calc_diff(value) for key, value in ind_dict.items()}

    for k in s:
        answer.append(result_dict[k].pop(0))

    return answer
  • 작동은 하는데 시간 초과로 실패
  • 알파벳과 알파벳의 위치 인덱스가 담긴 딕셔러니 만들고
  • 인덱스들의 차이 구하는 함수, 첫 번째 요소는 -1로 지정
  • s 순서대로 answer에 추가해줌

 

 

 

 

참조


https://sxbxn.tistory.com/35

 

[Python] 위치(인덱스) 찾기 (find(), index())

백준 1167 트리의 지름 특정 원소가 리스트의 몇 번째 인덱스에서 등장하는지 찾아야 했다. indexOf()가 안되길래 검색해보니 indexOf()는 자바스크립트 문법이었다.. 이참에 잘 정리해두자. 위치(인덱

sxbxn.tistory.com