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

4개의 풀이가 있습니다.

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

루비입니다.

def jolly_jumpers?(array)
  array.each_cons(2).map{|(a,b)| (a - b).abs }.sort == [*1...array.size]
end

puts jolly_jumpers?([1, 4, 2, 3]) ? "Jolly" : "Not Jolly"
puts jolly_jumpers?([5, 1, 4, 2, -1, 6]) ? "Jolly" : "Not Jolly"
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
    Sub Main()
        Dim d() As Integer = Array.ConvertAll(Split(Console.ReadLine, " "), Function(n As String) CInt(Val(n)))

        Dim c As Integer = Math.Abs(d(0) - d(1))
        Dim result As Boolean = True

        For i As Integer = 1 To d.Length - 1
            Dim a As Integer = Math.Abs(d(i - 1) - d(i))

            If i > 1 And Math.Abs(a - c) <> 1 Then
                result = False
                Exit For
            End If

            c = a
        Next

        Console.WriteLine(IIf(result, "Jolly", "Not Jolly"))

        Console.ReadLine()
    End Sub
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#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");
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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

구현 x 2
연관 문제

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