본문 바로가기
Programming/Python

[프로그래머스 Python] 가장 가까운 값 찾기

by 용스토리랜드 2024. 7. 12.

💡문제 설명

문자가 주어지면, 문자를 하나씩 순서대로 순회하면서 앞에 같은 글자가 있으면 얼마나 가까운지를 인덱스 차로 표현하고, 없다면 그냥 -1을 반환하는 문제

💡제한 사항 및 입출력 예제

 

위의 입출력 예제 처럼 b > a > n > a > n > a 이렇게 순회하는데, b 는 당연히 맨 앞이니까 -1 이 반환되고 a 는 앞에 a 와 동일한 글자가 없기 때문에 -1 , n 도 -1 , 그 다음 나오는 a 는 2 칸 앞에 같은 글자가 있으니 2를 반환, n 도 2칸 앞에 n 이 있으니 2 를 반환, 마지막 a 는 앞에 같은 글자가 2개 있는데, 가장 가까운 a 와의 거리를 계산해야 하므로 2 가 반환되도록 코딩을 해야한다.

 

💡나의 정답

1. answer 라는 빈 리스트 생성

2. 일단 1번째 문자는 무조건 -1 추가 (to answer 리스트)

3. s1 은 기준 문자

4. 그 다음 글자부터는 prior_str 라는 빈 리스트를 만들어 주고 i 번째 전까지 문자들을 넣어준다. 

5. 만약 i 번째 전 문자들에서 비교하려고 했던 기준 문자 (여기서는 s1) 와 같은 곳의 인덱스를 리스트 형태로 뽑아서 max 함수를 통해 가장 기준문자와 가까운 곳의 인덱스를 뽑아준다. 그리고 s1 의 인덱스와의 차를 answer 에 append !

6. 만약 앞서 나온 문자 중에 기준 문자와 같은 것이 없다면 -1 추가 

 

.... 복잡하게 풀었다. ㅠ,, 연산량이 많아서 통과는 됐지만 채점하는데 시간이 오래 걸림

def solution(s):
    answer = [] 
    for i, s1 in enumerate(s) : 
        if i == 0 :
            answer.append(-1)
        else : 
            prior_str = [] # ['b', 'a', ...]
            for j in range(i) :
                prior_str.append(s[j]) # 비교하려는 문자들 , 기준 문자 앞의 문자들
            if s1 in prior_str : 
                max_index = max(list(filter(lambda x : prior_str[x] == s1, range(len(prior_str)))))
                answer.append(i - max_index)
            else :
                answer.append(-1)
    return answer

 

💡다른 실력자 분들의 코드

- 딕셔너리 자료형을 활용해서 풀었음. 

- 같은 문자열이 등장할 때 {key : value} 형태를 활용하여 같은 key 가 나오면 value(index) 를 갱신해주는 방법

- 그리고 (키) not in (dictionary객체) 문법을 사용해 dictionary 객체에 키가 없으면, 아직 반복된 문자열이 아님을 의미하기 때문에 -1 을 answer 리스트에 추가

answer = [] 
dic = {} # 빈 딕셔너리 생성, 
# {"b" : 0} -> {"b" : 0, "a" : 1} -> {"b" : 0, "a" : 1, "n" : 2} -> {"b" : 0, "a" : 3, "n" : 2}

for i in range(len(s)) : 
    if s[i] not in dic : # 딕셔너리에 문자s[i] 와 동일한 key가 있는지 조회,, 없으면 -1 추가
        answer.append(-1)
    else : 
        answer.append(i - dic[s[i]]) # 현재 인덱스에서 앞에 나온 문자의 인덱스 빼기
    dic[s[i]] = i # {요소 : 인덱스} 이 인덱스는 같은 요소가 반복되면 최신화
answer
# dictionary 의 장점 : key에 대한 값을 쉽게 저장하고 찾을 수 있음
# 복잡한 로직을 요하는 문제가 아니라서  자료형에 대한 기본적인 이해가 있다면 어렵지 않다는데,,, 난 아직 자료형에 기본적인 이해가 조금 부족한듯ㅎㅎㅎㅎㅎ; ㅠ

 

리스트에 너무 익숙해져서 다른 자료형을 적절한 상황에 활용을 하지 못했다.. 파이썬의 다른 자료형도 더 익숙해지고 감을 익혀서 다양한 방식으로 문제에 접근해야겠다.
반응형