[Python] 코딩 도장 - Jolly Jumpers
Updated:
코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.
코딩 도장에서 여러 문제를 확인할 수 있습니다.
난이도 순으로 차근차근 풀어보려 합니다.
[문제: Jolly Jumpers] - Lv.2
n개의 정수(n>0)로 이루어진 수열에 대해 서로 인접해 있는 두 수의 차가 1에서 n-1까지의 값을 모두 가진다고 하자.
이러한 수열을 유쾌한 점퍼(jolly jumper)라고 부른다.
예를 들어 다음과 같은 수열에서
1 4 2 3
앞 뒤에 있는 숫자 차의 절대 값이 각각 3,2,1이므로 이 수열은 유쾌한 점퍼가 된다.
어떤 수열이 유쾌한 점퍼인지 판단할 수 있는 프로그램을 작성하라.
Input
각 줄 맨 앞에는 3000 이하의 정수가 있으며 그 뒤에는 수열을 나타내는 n개의 정수가 입력된다. 맨 앞 숫자가 0이면 출력하고 종료한다.
output
입력된 각 줄에 대해 “Jolly” 또는 “Not Jolly”를 한 줄씩 출력한다
Sample Input
4 1 4 2 3
5 1 4 2 -1 6
※ 주의: 각 줄의 맨 앞의 숫자는 수열의 갯수이다. 첫번째 입력인 4 1 4 2 3 의 맨 앞의 4는 뒤에 4개의 숫자가 온다는 것을 의미함
Sample Output
Jolly
Not jolly
출처: https://codingdojang.com/scode/424?answer_mode=hide
[풀이]
def f():
lst = list(map(int, input().split()))
a = [i for i in range(1, lst.pop(0))]
b = sorted([abs(i-j) for i, j in list(zip(lst[0:], lst[1:]))])
if a==b:
print("Jolly")
else:
print("Not jolly")
f()
f()
4 1 4 2 3
Jolly
5 1 4 2 -1 6
Not jolly
정수 n은 필요 없기에 pop()
으로 제거하면서 제거 된 값이 return 됨을 이용해 1부터 n-1까지 값을 가지는 리스트를 만들었다.
나머지 수열은 zip()
을 이용해 pair를 만들어 차이값을 생성 후 정렬한 리스트를 만들었다.
마지막으로 두 리스트가 완전히 일치한다면 Jolly를 반환하게 된다.
[추천 풀이]
def do(xs):
return {abs(x[0] - x[1]) for x in zip(xs, xs[1:])} == set(range(1, len(xs)))
data = []
while True:
i = [int(x) for x in input().split()]
if i[0] == 0:
break
data.append(i[1:])
for d in data:
if do(d):
print("Jolly")
else:
print("Not Jolly")
5 1 4 2 -1 6
0
Not Jolly
set을 사용한 점과 여러 입력이 가능하게 한 점 외에는 동일하다.
Leave a comment