문 제

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, …, C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다. 연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을 작성하시오.

입 력

첫째 줄에 8개 숫자가 주어진다. 이 숫자는 문제 설명에서 설명한 음이며, 1부터 8까지 숫자가 한 번씩 등장한다.

1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1
8 1 7 2 6 3 5 4

출 력

첫째 줄에 ascending, descending, mixed 중 하나를 출력한다.

ascending
descending
mixed

코 드

using System;
using System.Linq;
using static System.Console;

namespace algorithm
{
    class Program
    {
        public enum eType : byte
        {
            ascending,
            descending,
            mixed,

            None
        }

        static void Main(string[] args)
        {
            string[] input = new string[8];
            input = ReadLine().Split(' ');

            int[] inputNum = input.Select(int.Parse).ToArray();
            eType type = CheckType(inputNum[0], inputNum[1]);

            switch (type)
            {
                case eType.mixed:
                    break;

                case eType.ascending:
                case eType.descending:
                    type = CheckType(type, inputNum);
                    break;
            }

            Write(type.ToString());
        }

        static eType CheckType(int A, int B)
        {
            if (Math.Abs(A - B) > 1)
                return eType.mixed;
            else if (A > B)
                return eType.descending;
            else if (A < B)
                return eType.ascending;

            return eType.None;
        }

        static eType CheckType(eType type, int[] inputNum)
        {
            for (int i = 2; i < inputNum.Length; i++)
            {
                eType tempType = CheckType(inputNum[i - 1], inputNum[i]);

                if (type != tempType)
                {
                    type = tempType;
                    break;
                }
            }

            return type;
        }
    }
}

비교코드 - 1

Linq를 이용하여 엄청 간단하게 풀어버렸다..

using System;
using System.Linq;
using static System.Console;

namespace algorithm
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] ascending = Enumerable.Range(1, 8).ToArray();
            int[] descending = Enumerable.Range(1, 8).Reverse().ToArray();

            int[] input = ReadLine().Split().Select(int.Parse).ToArray();

            if (input.SequenceEqual(ascending))
                Write("ascending");
            else if (input.SequenceEqual(descending))
                Write("descending");
            else
                Write("mixed");
        }
    }
}

공 부

Enumerable 클래스

  • System.Linq : LINQ 쿼리 사용
  • ‘비교코드 - 1’ 중
    • Enumerable.Range(A, B) : 특정 범위 숫자 집합을 만들 때 사용, A부터 B까지 숫자 집합 int 배열로 만듦.
    • input.SequenceEqual(input타입) : 두 시퀀스에 동일한 수의 데이터가 존재하고 동일한 순서로 정렬되어 있는 경우 TRUE 반환, 아닌 경우 FALSE 반환