[파이썬 코딩테스트] 가장 가까운 같은 글자

ch.2·2024년 7월 25일
0

코딩 테스트

목록 보기
14/21
post-thumbnail

문제

프로그래머스 연습 문제

문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

예시

예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

답안 분석

def solution(s):
    answer = []
    s_dict = {}
    for index, value in enumerate(s):
        if value not in s_dict :
            answer.append(-1)
            s_dict[value] = index 
        else :
            answer.append(index - s_dict[value]) 
            s_dict[value] = index 
    
    return answer
  • s_dict = {}
    : for 반복문에서 enumerate(s)를 사용할 것이기 때문에 s의 값을 담을 딕셔너리를 만들어준다.

  • for index, value in enumerate(s):
    : 딕셔너리에 담을 것이기 때문에 for에 대한 인자를 index(문자의 위치), value(문자의 값) 두 가지로 설정해준다.

    e.g) 0 b, 1 a, 2 n, 3 a, 4 n, 5 a

  • s_dict[value] = index
    : 우선 처음 등장하는 문자는 answer 리스트에 -1의 값을 추가한다.
    이후 문자를 딕셔너리의 키값에 할당하고, 그 문자의 인덱스를 딕셔너리의 밸류에 할당한다.

    e.g) 1 a → s_dict[a] = 1
    { 'a' : 1} 딕셔너리 내 a에 대한 값으로 1이 저장된다.

  • answer.append(index - s_dict[value])
    : 중복되는 문자가 나왔을 때 그 문자의 인덱스에서, 이전에 저장한 동일한 값의 인덱스(딕셔너리의 밸류)를 뺀다.
    중복되는 문자로부터 이전에 나온 문자가 몇 칸 앞에 있는지 구하는 부분이다.

    e.g) 3 a → 3 - 1 = 2

  • s_dict[value] = index
    : 중복되는 문자를 딕셔너리의 키값에 할당한다. (이전에 나왔던 동일한 값과 같은 키값이다.)
    이후 중복되는 문자의 인덱스를 딕셔너리의 밸류에 재할당한다.

    e.g) s_dict[a] = 3
    { 'a' : 3} 딕셔너리 내 a의 값이 3으로 업데이트된다.



tip!

s_dict[value] = index 구문은 각 if문과 else에서 반복되므로 매번 쓰지 않고
if문과 else 블록 바깥에 한 번만 적어도 공통적으로 실행된다!

profile
데이터 분석 공부중

0개의 댓글