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

23개의 풀이가 있습니다. 1 / 3 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
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#!/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)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

[파이썬]

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

파이썬 입니다~ 첫번째 것은 set을 활용, 두번째 것은 길가의 풀님 꺼를 배껴봤습니다~(개악버젼이네요ㅎㅎ;;)

class Jolly:
    def __init__(self,a,b):
        self.n_lst = range(1,a)
        self.lst = b
    def start(self):
        x_lst = []
        for i in range(len(self.lst)-1):
            numb = self.lst[i] - self.lst[i+1]
            x_lst.append(abs(numb))
        set_a = set(self.n_lst)
        set_b = set(x_lst)
        if set_a & set_b == set_a: print "Jolly"
        else: print "Not Jolly"

test = Jolly(4, [1,4,2,3])
test.start()

class Jolly:
    def __init__(self,a,b):
        self.f_numb = a-1
        self.lst = b
    def start(self):
        x = [False] * self.f_numb
        for i in range(len(self.lst)-1):
            a = abs(self.lst[i] - self.lst[i+1]) - 1
            if a < len(x):
                x[a] = True
        check = True
        for i in x:
            if x[i] == False: check = False
        if check == True:
            print "Jolly"
        else: print "Not Jolly"

test = Jolly(4, [1,4,2,3])
test.start()

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

Python으로 작성을 했는데... 다른분들 풀이 보니까 제가 너무 예제에 대해서만 생각 한것 같네요 방법은 인근 숫자들끼리 빼기한 값들을 List로 만들고 그 List가 N을 나타내는 제일 앞의 숫자와 제일 큰 숫자를 제외한 input 숫자들과 동일하면 Jolly를 나타내게 했습니다. 즉 4,1,4,2,3 중에서 단지 개수만 나타내는 제일앞의 4를 제외하고 나머지 1,4,2,3 중에 제일 큰 숫자인 4를 제외하는 것입니다. 빼기일테니 제일 큰숫자는 없는게 맞겠죠?

def Jolly (InputList):
    JJList = InputList[1:]
    Number = len(JJList)
    SubList=[]

    while Number-1:
        Number -= 1
        Sub = abs(JJList[Number-1] - JJList[Number])
        SubList.append(Sub)

    SubList.sort() #뺀값들만 모아서 Sort하여 정렬
    JJList.sort()
    JJList.pop()#빼기를 하게 되므로 최대값은 나올수가 없다. 때문에 sort한다음 pop을하여 마지막 숫자(Input List중 최대값)를 빼낸다.

    if SubList == JJList: print("Jolly")
    else : print("Not Jolly")

Jolly([4,1,4,2,3])
Jolly([5,1,4,2,-1,6])
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

python 입니다.

import unittest

def func(s, result="Jolly"):
  l = s.split(" ")
  n = int(l.pop(0)) 
  for i in range(n-1):
    if abs(int(l[i]) - int(l[i+1])) >= n : result = "Not Jolly"
    print abs(int(l[i]) - int(l[i+1]))
  return result

class Test(unittest.TestCase):
  def test1(self):
    self.assertEqual('Jolly', func('4 1 4 2 3'))
    self.assertEqual('Not Jolly', func('5 1 4 2 -1 6'))

if __name__ == "__main__":
  unittest.main()

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

풀이 작성

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

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

구현 x 2
연관 문제

언어별 풀이 현황
전 체 x 40
python x 23
기 타 x 4
clojure x 1
java x 7
cs x 2
ruby x 1
cpp x 1
matlab x 1