설명
음계 어쩌고 저쩌고 써져있지만 그냥 주어진 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일경우로 나누어 문제를 풀기시작한다던가...
콘솔실행
정상 실행된다.