본문 바로가기

Python(알고리즘,문제풀이)/프로그래머스(입문100제)

코딩테스트입문 / 가까운 수

728x90

📚문제

출처 : 프로그래머스 / 가까운 수 (https://school.programmers.co.kr/learn/courses/30/lessons/120890)

 

📝풀이

# 내 코드 # 테스트케이스 실패

array = [3, 28, 10]
n = 20

new_array = []
    
for num in array:
    new_array.append(abs(num-n))
    
min_index = min(new_array) 
min_index_list = [ idx for idx, num in enumerate(new_array) if num == min_index]

x = []
if min_index >=2:
    for i in min_index_list:
        x.append(array[i])
    print(min(x))
else:
    min_index = new_array.index(min_index)
    print(array[min_index])

 

코드를 생각해나가다 보니까 너무 복잡해졌다 

아직까지 깔끔하게 풀이가 안 떠오르고 이렇게 지저분해지는건 갈 길이 많이 남았다는거겠지..?

심지어 이렇게 열심히 풀었는데 테스트 케이스 1 2개 틀리면 현타온다....

 

array = [3, 28, 12]
n = 20

new_array = []
array.sort()

for num in array:
    new_array.append(abs(num-n))

answer = [array[new_array.index(min(new_array))]]
answer

 

그래서 조금 수정해서 간단하게 풀어봤다

 

첫 코드의 경우에서 틀렸을 만한 이유가 가까운 수가 2개일 때

(예를들어 array = [3, 12, 28] , n=20인 경우)

2개중에 더 작은 수를 고르지 못해서 틀렸을거라 생각했다

 

그래서 저렇게 복잡하게 분류해주었던건데

구글링하여 참고해보니

 

입력받는 array를  sort()로 정렬해주게 된다면

array에서 오름차순으로 정렬된다 (작은수가 먼저 나오게)

 

마지막 answer 코드에서도 

min(new_array)값이 2개더라도

new_array.index( min(new_array) ) 에서 더 먼저나오는 인덱스값 1개를 반환한다

따라서 배열 된 array와 인덱스 순서가 일치하므로

가까운 수가 2개일 때 더 작은수를 고르게 되는 것이다..! 

 

 

+ 추가로 다른 분의 lambda 함수 활용한 코드

 

solution=lambda array,n:sorted(array,key=lambda x:(abs(x-n),x))[0]

 

보고 감탄만 나온다...

어떻게 이렇게 깔끔하게 작성할 수 있는지 신기하다...

역시 lambda함수를 잘 활용하면 코드가 간결해지는 것 같다

 

코드를 하나하나 살펴보자

1. lambda 함수의 인자로 array와 n을 입력받음

2. array를 sorted()함수 이용하여 정렬

3. 이 때, key를 지정해주어 key대로 정렬

4. key지정할 때도 lambda함수 사용하여 x (array의 인자들) 지정

5. abs(x-n) 하여 n과의 거리 계산. 값 작을수록 x와 n의 값이 가까움

6. 뒤에 x는 x의 값을 그대로 반환

7.x:(abs(x-n),x)

=> 이 부분이 잘 이해가 안 가는데 순서쌍 앞쪽의 거리(abs(x-n))가 같다면 x가 더 작은 값이 우선순위를 가진다고한다.

(이 코드가 그런 뜻...?)

8.key를 기준으로 정렬된 array 함수에서 array[0] (거리가 가장 가까운 인자 : n과의 값의 차가 제일 적은 인자)

를 반

728x90