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

2개의 풀이가 있습니다.

C#으로 작성했습니다. 1. 문제에서 요구하는 code는 input 한 줄, output 한 줄 출력하는 게 아닌지요? sample은 input을 한꺼번에 받는 듯이 보여서 여쭤보았습니다. 저는 일단 가장 앞 줄에 정해진 n을 찾은 후에 나머지 숫자를 list에 집어 넣고 n과 list의 count를 비교했습니다. 다음에 list에 있는 숫자들 중에 1보다 작거나 n-1보다 큰 숫자는 무조건 다 없앴습니다. 그럼 당연히 1에서 n-1까지 숫자가 list에 남겠죠. 그리고 그 list의 count를 n-1과 비교했습니다. 2. BitArray에 i와 i+1의 차잇값을 저장하였습니다.

using System;
using System.Collections;
using System.Collections.Generic;

        public bool IsJollyJumper(List<int> inputs)
        {
            var bits = new BitArray(inputs.Count);
            for (int i = 0; i < inputs.Count - 1; i++)
            {
                var diff = Math.Abs(inputs[i] - inputs[i + 1]);
                if (diff < 1 || diff >= inputs.Count || bits.Get(diff)) return false;
                bits.Set(diff, true);
            }
            return true;
        }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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");
            }

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

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

풀이 작성

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

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(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