이번에도 스트레스에 지친 두뇌를 쉬게(?) 하기 위해 풀어본 심심풀이 프로그래밍 문제입니다.

연속으로 주어진 숫자들이 n개 있으면 이 숫자들의 간격이 1부터 n-1까지 종류별로 모두 있는 경우를 졸리 점퍼(Jolly jumper)라고 부른다. 예를 들어 1 4 2 3이라는 4개의 숫자가 있을 때 1과 4의 간격은 3, 4와 2의 간격은 2, 2와 3의 간격은 1로 1에서 3까지 모두 있다.

숫자 리스트를 입력 받아 졸리 점퍼인지 판단하는 프로그램을 작성하라.

원 문제 링크 : http://functional.or.kr/node/131

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#! /usr/bin/perl

use strict;
use warnings;
use integer;

my @n;
my %d;
my $a;

@n = split '\s+', <>;

if ( is_jolly_num(@n) ) {
    print "Jolly.\n";
}
else {
    print "Not jolly.\n";
}

sub is_jolly_num {
    my @n = @_;

    foreach ( @n ) {
        $d{abs($a - $_)} = 1 if defined($a);
        $a = $_;
    }

    foreach ( 1..(@n - 1) ) {
        unless ( defined($d{$_}) ) {
            return 0;
        }
    }

    return 1;
}