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

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

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

import java.util.Arrays;
import java.util.Scanner;

public class Jolly_Jumper {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int[] arr;
        int[] jol;

        for(int num = scan.nextInt(); num != 0; num = scan.nextInt()){
            arr = new int[num];
            jol = new int[num-1];

            for(int i = 0; i < num; i++){
                arr[i] = scan.nextInt();
            }

            for(int i = 0; i < num-1; i++){
                jol[i] = Math.abs(arr[i+1]-arr[i]);
            }
            Arrays.sort(jol);

            for(int i = 1; i < num; jol[i-1] = 0, i++){
                if(i != jol[i-1]){
                    System.out.println("Not Jolly");
                    break;
                }

            }
            if(jol[num-2] == 0)
                System.out.println("Jolly");

            arr=null;
            jol=null;
        }


    }

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def joly_jumper(data):
    n=data[0]
    data=data[1:]
    if n==0:
        return "Jolly"
    dic={}
    for i in range(len(data)-1):
        dic[abs(data[i]-data[i+1])]=1
    data=list(dic.keys())
    data.sort()
    if data==list(range(1,n)):
        return "Jolly"
    return "Not jolly"
joly_jumper([5, 1, 4, 2, -1, 6])
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int n;
void main() {
    scanf("%d", &n);
    int *arr = (int*) malloc (sizeof(int) * n);
    for(int i=0;i<n;i++)
        scanf("%d", &arr[i]);

    int jolly = 0;
    for(int i=0;i<n;i++)
        for(int j=0;j<n-1;j++)
            if(i == abs(arr[j] - arr[j+1])) {
                jolly++;
                break;
            }

    if(jolly == n-1)
        printf("jolly \n");
    else 
        printf("not jolly\n");
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
list_ = list()
while list_ == [] or list_[-1][0] != '0':
    list_ += [input().split(' ')]
list_.pop(-1)
for z in range(len(list_)):
    if [ x for x in range(1,len(list_[z])-1)] ==\
       sorted([abs(int(x[y]) - int(x[y+1])) for x in list_ for y in range(1,len(x)-1)]):
        print('Jolly')
    else:
        print('Not Jolly')

#### 2016.12.20 D-429 ####
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def jolly_jumper(val):
    va = val.strip().split('\n')
    for v in va:
        vi = v.split(' ')
        if vi[0] == '0':
            break
        src = vi[1:]
        jolly = set([abs(int(src[x]) - int(src[x + 1])) for x in range(0, len(src) - 1)]) \
                - set(range(1, int(vi[0])))
        print('Jolly' if len(jolly) == 0 else 'Not jolly')

jolly_jumper('''
4 1 4 2 3
5 1 4 2 -1 6
''')

Python 3.5.2에서 작성하였습니다.

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

파이썬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
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public void JollyJumperDiscriminator(int[] input)
        {
            int length = input.Length;
            int[] nNum = new int[length];
            int[] differences = new int[length - 1];

            for (int i = 0; i < length; i++)
            {
                nNum[i] = i + 1;
            }

            nNum = (from Nums in nNum
                    orderby Nums ascending
                    select Nums)
                    .ToArray();

            for (int j = 0; j < input.Length - 1; j++)
            {
                differences[j] = Math.Abs(input[j + 1] - input[j]);
            }

            differences = (from Nums in differences
                           orderby Nums ascending
                           select Nums)
                          .ToArray();
            int equalcount = 0;

            for (int k = 0; k < differences.Length; k++)
            {
                if (differences[k] == nNum[k])
                {
                    equalcount++;
                }
            }

            if (equalcount == differences.Length)
            {
                Console.WriteLine("Jolly Jumper");
            }
            else
            {
                Console.WriteLine("Not Jolly Jumper");
            }

대충 짜서 코드도 좀 더럽(?)고 무엇보다 입력 방식이 다릅니다ㅋㅋ 다만 결과는 같아요

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

# def_name = check_jumper, input = length of the list, list / output = whether it is jumber or not, type of the result = strings
# what We need, how to organize this problem?
# first of all, should make the list of (1 ~ n-1)
#

def check_jumper(number, list):
    checker_list = []
    while number > 1:
        number -= 1
        checker_list.append(number)
    for check in range(1,len(list)):
        if abs(list[check-1]-list[check]) in checker_list:
            checker_list.remove(abs(list[check-1]-list[check]))
    if len(checker_list) == 0:
        return "jolly"
    else:
        return "not jolly"
print check_jumper(4,[1,4,2,3]) #result : jolly
print check_jumper(5,[1,4,2,-1,6]) #result : not jolly
print check_jumper(6,[1,6,10,13,15,14]) #result : jolly
print check_jumper(3,[1,2,6,7]) #result : not jolly
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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

구현 x 2
연관 문제

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