Jolly Jumpers

출처 : programming-challenges.com

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
구현
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

36개의 풀이가 있습니다. 1 / 4 Page

파이썬입니다. jolly 여부를 판단하는 do 함수는 입력받은 리스트의 인접 원소들을 짝지어서 그 차이를 구합니다. jolly jump 인 값은 이 차이의 집합을 정렬한 결과가 1, 2, 3, ..., n - 1 이기 때문에 그냥 set 으로 만들어서 비교했습니다.

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")
+1 인접한 두수의 차를 zip(xs, xs[1:])으로 한다는 것은 생각 못했네요~ 잘 배우고 갑니다^^ - 디디, 2016/03/26 11:00 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬3.5

zip을 이용했습니다.

def isjolly(a):

    a_ = [abs(a-b) for a, b in zip(a, a[1:])]
    return 'Jolly' if len({abs(a-b) for a, b in zip(a_, a_[1:])}) == 1 else 'Not jolly'


a = [1, 4, 2, 3]
b = [1, 4, 2, -1, 6]

print(isjolly(a), isjolly(b), sep='\n')
무조건 jolly가 나오려면 일정한 규칙이 나올수밖에 없군요... 대단하십니다! - GunBang, 2016/12/20 23:12 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def jolly?(seq)     
    differences = seq.drop(1).inject(seq.take(1)) do |result, elem|     
        prev = result.pop
        result << (prev - elem).abs
        result << elem
        result
    end
    differences.pop
    differences.sort == (1 .. (seq.length-1)).to_a
end

data_set = STDIN.read.split(/[\r\n]/)

data_set.each do |data|
    if jolly? data.split(/\s+/).drop(1).map(&:to_i)
        puts "Jolly"
    else
        puts "Not jolly"
    end
end
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#!/usr/bin/python

import os
import sys

def main():
    if len(sys.argv) is 1:
        print "set input file"

    else:
        f = open(sys.argv[1],'r')
        lines = f.readlines()
        for line in lines:
            n = int(line.split()[0])
            check = [0] * (n-1)
            for i in range(2, n+1):
                abscha=abs(int(line.split()[i])-int(line.split()[i-1]))
                if abscha < n:
                    check[abscha-1] = 1
            gob = 1
            for i in range(0, n):
                gob=gob * int(check[0])
            if gob == 1:
                print "Jolly"
            else:
                print "Not jolly"

if __name__ == '__main__':
    main()
    sys.exit(0)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

clojure

(def not-nil? (complement nil?))


(defn ??-coll? [?? coll]
  (->> coll
       (reduce #(when (and %1 (= (?? %1) %2)) %2))
       not-nil?))


(def dec-coll? (partial ??-coll? dec))


(defn jolly? [coll]
  (->> coll
       (partition 2 1)
       (map #(Math/abs (apply - %)))
       dec-coll?))


(map jolly? [[1 4 2 3]
             [1 4 2 -1 6]])

;=> (true false)

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

[파이썬]

def Jolly(l):
    buff = []
    i = 1
    while i < len(l):
        buff.insert(i, abs(l[i-1] - l[i]))
        i += 1
    buff = list(set(buff))

    if buff[0] == 1 and buff[-1]*(buff[-1]+1)/2 == sum(buff):
        print "Jolly"
    else:
        print "Not Jolly"


n1 = [4,1,4,2,3]
n2 = [5,1,4,2,-1,6]

Jolly(n1)
Jolly(n2)
Jolly
Not Jolly

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬입니다.

1부터 n-1까지의 값을 모두 가지고 있어야 한다는 조건이 있어서 비트배열을 이용해 보았습니다.

def jolly(s):
    s = map(int, s.split()[1:])
    m = [False] * (len(s)-1)
    for i in range(len(s)-1):
        idx = abs(s[i]-s[i+1])-1
        if idx < len(m): 
            m[idx] = True
    return len(m) == m.count(True) and "Jolly" or "Not jolly"


print jolly("4 1 4 2 3")
print jolly("5 1 4 2 -1 6")
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def jolly(n, l):
    return "Jolly" if sorted([abs(l[i]-l[i+1]) for i in range(n-1)]) == range(1, n) else "Not jolly"

while True:
    line = [int(x) for x in raw_input().split()]
    n, l = line[0], line[1:]

    if n == 0:
        break

    print jolly(n, l)

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 3.4 입니다. 풀고나니 1부터 n-1까지의 값을 모두 가지고 있어야 한다는 조건을 활용하질 못 했네요

def call_jol(data):
    diff = []
    decision_num = 0
    call = 'jolly'
    for x in range(len(data)-1):
        diff_ele = abs(data[x+1]-data[x])
        diff.append(diff_ele)
    for x in range (len(diff)):
        if diff[x] in data:
            pass
        else:
            decision_num += 1
    if decision_num != 0:
        call = 'Not jolly'
    return call

data = list(map(int,input("Enter your numbers.\n").split(" ")))
print (call_jol(data))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
package my;

import java.util.Scanner;

public class T {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("수열 수 입력:");
        String temp =in.nextLine();
        String[] t= temp.split(" ");
        int[] arr= new int[t.length];
        for(int i=0;i<t.length;i++){
            arr[i]=Integer.parseInt(t[i]);
        }

        int base=arr[0]-1;
        String result="jolly";
        for(int i=1;i<arr.length-1;i++){
            int cal = 0;
            if(arr[i]>arr[i+1]){
                cal=arr[i]-arr[i+1];
            }else{
                cal=arr[i+1]-arr[i];
            }
            if(base!=cal){
                result="Not jolly";
            }
            base-=1;
        }

        System.out.println(result);

    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.

구현 x 2
연관 문제

언어별 풀이 현황
전 체 x 36
java x 5
python x 22
cpp x 1
기 타 x 4
cs x 2
clojure x 1
ruby x 1