📚문제
📝풀이
# 내 코드 # 테스트케이스 실패
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과의 값의 차가 제일 적은 인자)
를 반
'Python(알고리즘,문제풀이) > 프로그래머스(입문100제)' 카테고리의 다른 글
코딩테스트입문 / 문자열 계산하기 (0) | 2023.07.28 |
---|---|
코딩테스트입문 / 인덱스 바꾸기 (0) | 2023.07.27 |
코딩테스트입문 / 컨트롤제트 (0) | 2023.07.25 |
코딩테스트입문 / 소인수분해 (0) | 2023.07.23 |
코딩테스트입문 / 문자열 정렬하기(1) (0) | 2023.07.23 |