[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