프로그래머스 연습 문제
문자열 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으로 업데이트된다.
s_dict[value] = index
구문은 각 if문과 else에서 반복되므로 매번 쓰지 않고
if문과 else 블록 바깥에 한 번만 적어도 공통적으로 실행된다!