반응형

https://www.acmicpc.net/problem/2920

 

2920번: 음계

문제 다장조는 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인지 판별하는 프로그램을

www.acmicpc.net

문제

다장조는 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까지 숫자가 한 번씩 등장한다.

출력

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


입력이 1부터 8까지가 한 번씩만 등장하기 때문에 대충 for 문 돌리면서 숫자가 하나라도 틀리면 바로 mixed가 뜨게 만들면 간단하게 끝날 거라고 생각했다.


#include <stdio.h>

int main(void)
{
	int i, a;
	for (i = 1; i <= 8; i++)
	{
		scanf("%d", &a);
		if (a != i && a != 9 - i)
		{
			puts("mixed");
			return 0;
		}
	}
	if (a == 8)
	{
		puts("ascending");
	}
	else
	{
		puts("descending");
	}
	return 0;
}

그냥 1부터 시작하든지 8부터 시작하든지 순서가 안 맞으면 바로 mixed, 8로 끝나면 ascending, 1로 끝나면 descending을 출력하도록 코드를 짰다. 그런데 채점을 돌려보니 틀렸다고 나왔다!?!

뭔가 싶어 생각이란 걸 해봤는데(저 코드는 문제 보자마자 걍 생각 없이 짠 거...) 곰곰이 생각해보니 입력이 1 2 3 5 4 6 7 8 이렇게 들어오면 mixed라고 떠야 하지만 ascending이라고 뜨게 된다.

문제를 파악하고 적당히 땜빵해서 다시 코드를 짰다.


#include <stdio.h>

int main(void)
{
	int a, i;
	scanf("%d",&a);
	if (a == 1)
	{
		for (i = 2; i <= 8; i++)
		{
			scanf("%d",&a);
			if (a != i)
			{
				puts("mixed");
				return 0;
			}
		}
		puts("ascending");
		return 0;
	}
	else if (a == 8)
	{
		for (i = 7; i >= 1; i--)
		{
			scanf("%d",&a);
			if (a != i)
			{
				puts("mixed");
				return 0;
			}
		}
		puts("descending");
		return 0;
	}
	puts("mixed");
	return 0;
}

땜빵 코드라 뭔가 지저분해서 굉장히 마음에 안 들지만 뭐 채점을 통과했으니...ㅎㅎ

다른 사람이 짠 코드들 보니까 다 배열을 사용했다. 알고리즘 분류가 배열로 되어 있어서 그런가? 쩝... 다른 사람이 짠 코드에서 영감을 받아 깔끔하게 다시 짜보았다. 물론 난 배열을 안 쓰고!


#include <stdio.h>

int main(void)
{
	int a, i, b = 0;
	for (i = 1; i < 9; i++)
	{
		scanf("%d",&a);
		if (a == i)
		{
			b++;
		}
		else if (a == 9 - i)
		{
			b--;
		}
	}
	if (b == 8)
	{
		puts("ascending");
	}
	else if (b == -8)
	{
		puts("descending");
	}
	else
	{
		puts("mixed");
	}
	return 0;
}

변수 하나 추가로 아까보다 깔끔하니 만족!

반응형

+ Recent posts