코딩테스트/PYTHON

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

_알파카 2024. 7. 29. 16:45
728x90

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/142086

 

프로그래머스

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

programmers.co.kr

 

문자열을 순회하며, 해당 문자에서 가장 가까운 요소를 찾는 문제이다. 

 

내 풀이

def solution(s):
    # 각 문자의 결과 저장
    answer = []
    
    # 문자열을 순회하며 나온 문자 저장
    tmp = []
    
    for i in range(len(s)):
        
        # 문자가 처음 나왔는지 확인
        if s[i] in tmp:
            # 해당 문자가 등장한 위치를 모두 찾음
            idx = [j for j, value in enumerate(tmp) if value == s[i]]
            # 가장 최근에 등장한 위치와 현재 위치의 차이 계산
            answer.append(len(tmp) - idx[-1])
            
        else:
            # 문자가 처음 등장하면 -1로 표현
            answer.append(-1)
            
        # 등장한 문자를 tmp에 저장
        tmp.append(s[i])
    return answer

 

먼저, 문자열을 순회하며 나온 문자열을 별개로 저장할 리스트 tmp를 지정하였다. 

이후, 주어진 문자열을 순회하며, 해당 문자가 처음 나왔는지 아닌지 체크한다. 

문자를 주어진 문제에 따라 표시하고, 순회한 문자는 tmp 리스트에 집어 넣는다. 

 

이 과정에서 문자가 처음 나왔다면 -1로 표시하고, 

문자가 처음 나온 것이 아닌, tmp 배열 안에 있다면, 해당 문자의 위치를 tmp 배열 상에서 모두 찾는다. 

(문자가 이미 존재하면, 가장 최근에 추가된 위치를 찾아야되므로, 문자의 위치른

enumerate()를 이용해서 모두 찾아낸다. )

이를 바탕으로 문자의 위치 차이를 계산하고, 이 값을 answer 배열에 넣는다. 

 

 

다른 사람 풀이

def solution(s):
    answer = []
    s_dict = dict()
    
    for i in range(len(s)):
        if s[i] not in s_dict:
            answer.append(-1)
        else:
            answer.append(i - s_dict[s[i]])
        s_dict[s[i]] = i
        
    return answer

 

딕셔너리 자료형을 사용한 풀이이다. 

s_dict에는 각 문자의 마지막 인덱스를 저장하는 딕셔너리이다.

 

위의 이미지와 같이 문자열을 순회하며, 각 문자여로가 위치 정보를 s_dict에 넣는다. 

이때, 이전에 나온 문자의 경우 가장 최근의 위치값을 갱신해가는 것이다. 

예를 들어, banana에서 a는 총 3번 등장한다.

첫 번째 나온 a는 1번 위치(0부터 시작)가 되는 것이다. 

다음으로 나온 a는 3번 위치로 새롭게 갱신된다. 

 

 

느낀점

딕셔너리를 쓰는 것이 생각보다 손에 익지 않는다. 

적절하게 사용하면 문제를 쉽게 풀 수 있을 것 같은데 아직은 어려운듯하다. 

열심히 해봐야겠다. 

728x90