[Python] 코딩 도장 - 다음 입사문제

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: 다음 입사문제] - Lv.2

1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오.

(단 점들의 배열은 모두 정렬되어있다고 가정한다.)

예를들어 S={1, 3, 4, 8, 13, 17, 20} 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.

출처: https://codingdojang.com/scode/408?answer_mode=hide


[풀이]

s = [1,3,4,5,8,13,17,20,24,25,30]

def min_distance(s):
    a = {}

    for i in range(len(s)-1):
        a[(s[i],s[i+1])] = s[i+1] - s[i]
    
    # 최소값이 하나인 경우: min(a, key=a.get)
    return [key for key, value in a.items() if value == min(a.values())]

min_distance(s)
[(3, 4), (4, 5), (24, 25)]

배열이 정렬이 되어 있으므로 각 숫자의 양 옆과의 거리만 구하면 된다.

dictionary를 이용해서 각 pair를 key, 거리를 value로 저장하였다.

최소값을 가지는 경우가 여러개 일 수 있으므로 한줄 for문으로 조건을 주어 key를 출력하였다.


[추천 풀이]

s = [1,3,4,5,8,13,17,20,24,25,30]
pairs = zip(s[0:], s[1:])
print(list(sorted(pairs,key=lambda x:x[1]-x[0]))[0])
(3, 4)

이 분은 우선 pair를 zip()으로 간단하게 구하셨다.

이를 정렬하되 기준을 lambda 식으로 거리로 지정하여서 거리가 가까운 순으로 페어가 나타나게 된다.

한 가지 아쉬운점은 최소값이 여러개일 경우 맨 위 하나만 나온다는 점이다.

Leave a comment