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

46개의 풀이가 있습니다. 1 / 5 Page

Python 3으로 풀었습니다.

def check_jolly_jumper(s):
    items = [int(c) for c in s.split(' ')[1:]]
    diffs_set = {abs(items[i - 1] - items[i]) for i in range(1, len(items))}
    # print(diffs_set)

    if len(diffs_set) == len(items) - 1\
            and min(diffs_set) == 1\
            and max(diffs_set) == len(items) - 1:
        return 'Jolly'
    else:
        return 'Not jolly'
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def is_jolly(n, seq):    
    tups = list(zip(seq[:-1], seq[1:]))
    diff = [abs(tup[0]-tup[1]) for tup in tups]    
    return sorted(diff) == list(range(1, n))

input = [[4, 1, 4, 2, 3], [5, 1, 4, 2, -1, 6]]
for seq in input:
    if seq[0] == 0:
        break

    if is_jolly(seq[0], seq[1:]):
        print('Jolly')
    else:
        print('Not jolly')
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

javascript

var isJolly = function(line) {
    var input = line.split(" ");
    var size = input[0] || 0;
    if (size === 0) return;

    return distancesOf(input.slice(1)).sort().every((v, i) => v === (i + 1));
};

var distancesOf = function(array) {
    return Array.from(Array(array.length - 1), (v, i) => Math.abs(array[i + 1] - array[i]))
}

console.log(isJolly("4 1 4 2 3") ? "Jolly" : "Not Jolly");
console.log(isJolly("5 1 4 2 -1 6") ? "Jolly" : "Not Jolly");
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def Jolly(Jollylist):
    subs = []
    for i in range(len(Jollylist)-1):
        subs.append(abs(Jollylist[i] - Jollylist[i+1]))
    judge = 0
    for i in range(len(Jollylist)-1):
        if sorted(subs)[i] == i+1:
            judge += 1
    if judge == len(Jollylist)-1:
        return 'Jolly'
    else:
        return 'Not Jolly'

숏코딩을 고민해봐야겠습니다...

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

C-Sharp

using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System;
using static System.Math;

class Program
{
    static void Main()
    {
        List<string> sampleList = new List<string> { "4 1 4 2 3", "5 1 4 2 -1 6" };
        sampleList.ForEach(n => WriteLine(IsJolly(n)));
    }

    static string IsJolly(string str)
    {
        var n = Array.ConvertAll(str.Split(), int.Parse).Skip(1);
        var nAbs = n.Skip(1).Zip(n.Take(n.Count() - 1), (a, b) => Abs(a - b));
        return new HashSet<int>(nAbs.Skip(1).Zip(nAbs.Take(nAbs.Count() - 1), (a, b) => Abs(a - b))).Count() == 1? "Jolly" : "Not Jolly";
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 3에서 작성하였습니다.

코드:

class jollyJumpers:
    inputList = []
    inputCount = 0
    def __init__(self, inputList):
        self.inputList = inputList
    def printList(self):
        print(self.inputList)
    def checkJollyJumpers(self):
        totalCount = self.inputList.pop(0) - 1
        inputSet = set()
        setCount = 0
        for i in range(1, len(self.inputList)):
            inputSet.add(abs(self.inputList[i-1] -self.inputList[i]))
            setCount += 1
            if abs(self.inputList[i-1] -self.inputList[i]) > self.inputCount and  setCount != len(inputSet):
                print ("Not Jolly")
                return

        print ("Jolly")


if __name__ == "__main__":
    jolly = jollyJumpers([5, 1, 4, 2, -1, 6])
    jolly.checkJollyJumpers()
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Python 3.6.1

def check_jolly(n, in_list):
    in_num = list(map(int, in_list))
    for i in range(1, n):
        diff = abs(in_num[i - 1] - in_num[i])
        if diff == i or diff == n - i:
            pass
        else:
            return print("Not jolly")
    return print("Jolly")


in_str = input("Enter number with space separater: ")
in_list = in_str.split()
in_length = int(in_list.pop(0))

if in_length == len(in_list):
    check_jolly(in_length, in_list)
else:
    print("Array numbers does not agree with arrays")
다른 풀이들을 보면 zip(list[0:],list[1:]) 의 쌍으로 len(list)-1 만큼 묶어서 for loop 를 돌리는데 그렇게 하면 max 3000개의 수열일 경우 2999 까지 루프를 돌게 됩니다. 어차피 for 문을 돌때 비교를 해서 jolly jumper 의 조건을 만족시키지 못하면 무조건 not jolly 로 리턴하고 끝내면 되기에 순차적으로 비교하는 것이 loop 를 적게 도는 측면에서 유리합니다. - 예강효빠, 2017/05/20 07:06 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import java.util.*;

public class jolly_jumper {

    public static void jolly_def(String nums){
        String [] array_nums = nums.split(" "); // {"1","4","2","3"}

        int [] int_nums = new int[array_nums.length];
        for(int k =0;k<array_nums.length;k++){int_nums[k]=Integer.parseInt(array_nums[k]);}
        // int_nums = {1,4,2,3}

        int [] minus_nums = new int[(array_nums.length)-1];
        for(int i =0;i<(array_nums.length)-1;i++){minus_nums[i] = Math.abs(int_nums[i+1]-int_nums[i]);}
        Arrays.sort(minus_nums);

        int [] filter_nums = new int[array_nums.length-1];
        for(int l=0;l<array_nums.length-1;l++){filter_nums[l] = l+1;}

        if (Arrays.equals(minus_nums,filter_nums)){System.out.println("jolly");}
        else{System.out.println("not jolly");}  
    }

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String nums = sc.nextLine(); // 1 4 2 3
        jolly_jumper.jolly_def(nums);       
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.IntStream;

import static java.lang.System.in;

public class JollyJumpers {

    public static void main(String[] args) {
        Scanner sc = new Scanner(in);

        List<List<Integer>> nn = new ArrayList<>();

        while (sc.hasNextLine()) {
            int j = sc.nextInt();
            if (j == 0) break;
            List mm = new ArrayList(3000);
            for (int i = 0; i < j; i++) {
                mm.add(sc.nextInt());
            }
            nn.add(mm);
        }

        for (int i = 0; i < nn.size(); i++) {
            jolly(nn.get(i).size(), nn.get(i));
        }
    }

    private static void jolly(Integer n, List<Integer> nn) {
        List<Integer> l = new ArrayList<>();
        nn.stream().reduce((a, b) -> {
            l.add(Math.abs(a - b));
            return b;
        });
        System.out.println(IntStream.range(1, n).allMatch(i -> l.contains(i)) ? "Jolly" : "Not jolly");
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

MATLAB 입니다. input, str2num 등으로 입력받고, diff, sort, sum, abs 등의 함수를 이용했습니다.

while 1
    input_arr=str2num(input('input : ','s'));

    n=input_arr(1);
    if n==0
        disp('finished');
        return
    end
    if sum(abs(sort(abs(diff(input_arr(2:end))),'ascend') - (1:1:n-1)))==0
        disp('Jolly');
    else
        disp('Not jolly');
    end
end
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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

구현 x 2
연관 문제

언어별 풀이 현황
전 체 x 46
python x 27
javascript x 1
cs x 3
java x 7
matlab x 1
기 타 x 4
cpp x 1
ruby x 1
clojure x 1