[코딩도장] [Lv.2] 다음 입사문제 중에서
[ 문제 ]
1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오. (단 점들의 배열은 모두 정렬되어있다고 가정한다.)
예를들어 S={1, 3, 4, 8, 13, 17, 20} 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.
[ 풀이 ]
# My solution
n = list(map(int,input('입력하실 숫자를 띄어쓰기로 입력해주세요 >>> ').split())) #1
for i in range(len(n)-1) : #2
sub_m = n[i+1] - n[i]
if i == 0 : #3
sub = sub_m
result = [(n[i],n[i+1])]
elif sub_m < sub : #4
sub = sub_m
result = [(n[i],n[i+1])]
elif sub == sub_m : #5
result.append((n[i],n[i+1]))
for k in result : #6
print(k, end=' ')
실행결과
# 입력1
입력하실 숫자를 띄어쓰기로 입력해주세요 >>> 1 3 4 8 13 17 20
(3, 4) # 출력값1
# 입력2
입력하실 숫자를 띄어쓰기로 입력해주세요 >>> 1 6 8 12 14 19 26
(6, 8) (12, 14) # 출력값2
# 베스트 풀이 방법
python 2.7
s= [1, 3, 4, 8, 13, 17, 20]
pairs = zip(s[0:], s[1:])
pairs.sort(key=lambda x:x[1]-x[0])
print pairs[0]
#1
input()함수를 이용하여 1차원 점들의 위치를 입력받는다.
이때 한 번에 숫자들을 입력받기 위해서 input()함수 뒤에 .split()을 더해서 띄어쓰기를 기준으로 처음 입력을 문자열로 받는다.
그런 뒤 map()함수를 활용하여 입력받은 값들을 정수형(int)으로 바꿔준다.
이때 단순히 이대로 끝내면 map()함수는 입력받은 값을 <map object>의 특수한 형태로 저장하기 때문에 list()함수를 통해 리스트의 형태로 바꿔준다.
#2
문제는 점 사이 거리가 가장 짧은 숫자의 쌍을 구하는 문제이기 때문에 for 반복문을 이용하여 입력된 각각의 숫자쌍의 차이를 구할 수 있도록 반복한다.
풀이에서는 각 숫자의 바로 뒤 숫자와 차이를 구하도록 하였기 때문에 반복 범위는 len(n)-1로 설정하였다.
각 숫자쌍의 차이를 구한다(sub_m)
#3
문제에서 요구하는 것은 각 숫자쌍의 차이가 작은 것을 찾아야 하므로 숫자의 차이값을 비교할 수 있어야 한다.
따라서 숫자의 차이값을 변수에 따로 저장해두어 비교하도록 한다.
만일 반복문이 처음일 때는 비교할 차이값이 없으므로 if문을 활용하여 차이값을 변수(sub)에 바로 저장하도록 한다.
또한 숫자의 차이값을 계산한 숫자쌍을 출력해야 하기 때문에 이를 따로 모아두는 변수(result)를 생성하여 저장한다.
result를 굳이 리스트로 생성한 이유는 혹시나 여러 숫자쌍이 정답일 수도 있기 때문에 한 번에 모아서 출력하기 위함이다.
#4
반복문의 처음이 아니면서 만일 계산한 숫자쌍의 차이값(sub_m)이 이전에 저장했던 숫자쌍의 차이값(sub)보다 작은 경우, 가장 거리가 짧은 새로운 숫자쌍을 찾았다는 의미이다.
따라서 새롭게 sub와 result에 결과를 저장한다.
이때 단순히 변수에 새로운 값을 대입하는 것이기 때문에 이전에 저장돼있던 값들은 사라진다.
#5
다른 경우로 반복문의 처음이 아니면서 만일 계산한 숫자쌍의 차이값(sub_m)이 이전에 저장했던 숫자쌍의 차이값(sub)과 같은 경우, 거리가 가장 짧은 숫자쌍이 하나 더 있다는 의미이다.
따라서 이와 같은 경우는 숫자쌍의 숫자 사이 거리는 같기 때문에 따로 건드리지 않고, result에 발견한 숫자쌍을 대입이 아닌 리스트의 append()함수를 통해 새로 추가를 해준다.
#6
모든 반복문을 마치면 result 안에 들어있는 숫자쌍을 출력해준다.
출력은 for 반복문을 활용하고 반복 인자는 result로 넣어서 result 안에 있는 숫자쌍을 출력하도록 하였다.
단, 단순히 print()로 출력을 하면 숫자쌍이 여러 개인 경우 print() 함수는 줄바꿈이 기본값으로 설정되어 있기 때문에 계속해서 줄바꿈이 일어난다.
따라서 print()함수의 end 옵션을 공백(' ')으로 설정해준다.
이럴 경우 print()함수는 다음 출력값을 공백을 기준으로 하여 출력하기 때문에 줄바꿈 없이 한 줄에 출력받을 수 있다.
https://codingdojang.com/scode/408?answer_mode=hide
코딩도장
프로그래밍 문제풀이를 통해서 코딩 실력을 수련
codingdojang.com