모름

설명

음계 어쩌고 저쩌고 써져있지만 그냥 주어진 8개 숫자(1~8)가 오름차순, 내림차순으로 차례대로 정렬되어 있는지 확인하는 방법에 대한 문제다. 

 

코드(1)

using System;

class Program {
    
    static void Main()
    {
        while (true)
        {
            // - 8개 숫자를 입력받는다.
            string input = Console.ReadLine();
            string[] s = input.Split();
            int[] numbers = new int[8];

            string state = "";
            int isAscending = 0;
            int isDescending = 0;

            for (int i = 0; i < 8; i++)
            {
                numbers[i] = int.Parse(s[i]);
            }

            for (int i = 0; i < 8; i++)
            {
                if (i == 7) break;

                if (numbers[i] < numbers[i+1] && isAscending == i)
                {
                    state = "ascending";
                    isAscending++;
                }
                else if (numbers[i] > numbers[i + 1] && isDescending == i)
                {
                    state = "descending";
                    isDescending++;
                }
                else
                {
                    state = "mixed";
                    break;
                }
            }

            Console.WriteLine(state);
        }
    }
}

정수 8개를 입력받고 for문으로 배열에 값을 할당한다. 할당된 값을 가지고 다시 for문으로 i번째와 i+1번째의 수를 비교한다. 이때 i+1번째가 계속 커야만 오름차순(ascending)으로 볼 수 있다. 이걸 체크하기위해 isAscending이란 변수를 만들고 계속 커지는지 체크한다. descending도 마찬가지다. 그 외의 경우는 모드 mixed경우이므로 for문을 해제한다.

 

보면 몇몇부분이 깔끔하지가않다. 그래서 좀 더 깔끔하게 수정해본다. 아래는 수정된 코드다.

코드(2)

using System;

class Program {
    
    static void Main()
    {
        while (true)
        {
            // - 8개 숫자를 입력받는다.
            string input = Console.ReadLine();
            string[] s = input.Split();
            int[] numbers = Array.ConvertAll(s, int.Parse);

            string state = "";

            bool isAscending = true;
            bool isDescending = true;

            for (int i = 0; i < numbers.Length-1; i++)
            {

                if (numbers[i] < numbers[i+1] && isAscending)
                {
                    state = "ascending";
                    isAscending = true;
                    isDescending = false;
                }
                else if (numbers[i] > numbers[i+1] && isDescending)
                {
                    state = "descending";
                    isDescending = true;
                    isAscending = false;
                }
                else
                {
                    state = "mixed";
                    break;
                }
            }

            Console.WriteLine(state);
        }
    }
}

내림차순 오름차순 판독기의 기능을 한다. 범용으로 사용이 가능하다. 코드(1)의 경우 8개의 수에 한해서만 작동했다면 위 코드는 몇 개의 수든 오름차순 내림차순을 판별할수있다. isAscending도 이름에 맞게 boolean으로 타입을 바꿔줬다. 중간에 오름차, 내림차가 바뀐다면 bool값으로 if문 진입을 막아 else문으로 가게된다.

 

그럼 마지막으로 재미있는 코드비교시간..

 

코드비교

using System;

public class Program
{
    static void Main(string[] args)
    {
        var numsAr = Console.ReadLine();
        Console.WriteLine(numsAr == "1 2 3 4 5 6 7 8" ? "ascending" : numsAr == "8 7 6 5 4 3 2 1" ? "descending" : "mixed");
    }
}

보고 충격먹었던 코드다. 이런식으로도 생각할수있었구나.. 재미있던 코드다. 그리고 ?:연산자도 거의 기억속에 사장되어 있었는데 이 코드를 보고 새롭게 상기할수있었다. 그냥 입력값이 적다는 점을 이용해서 문자열을 단순비교하여 값을 낸 경우다.

?: 연산자란 (bool값의 조건식) ? (true일 경우 실행될 구문) : (false일 경우 실행될 구문)

 

그 외에도 다양한 코드들이 있었다. 예를 들어 시작 숫자가 1일경우와 8일경우로 나누어 문제를 풀기시작한다던가...

 

 

콘솔실행

정상 실행된다.