문제

숫자 맞추기 게임은 초등학교 학생들 사이에서 유행하는 게임이다. 선생님은 학생들의 연산 실력과 논리적인 사고력을 기르기위해 학생들에게 이 게임을 권유하고 있다.

이 게임을 시작할 때는 친구가 숫자 하나를 머리속에 생각해야 한다. 이 숫자를 n0이라고 하자. 그러고 나서 다음과 같이 게임을 진행한다.

  1. 친구에게 n1 = 3*n0 계산을 하라고 한 뒤, n1이 짝수인지 홀수인지를 말해달라고 한다.
  2. n1이 짝수라면, n2 = n1/2를, 홀수라면 n2 = (n1+1)/2를 계산해달라고 한다.
  3. n3 = 3*n2의 계산을 부탁한다.
  4. 친구에게 n4 = n3/9를 계산한 뒤, 그 값을 말해달라고 한다. (n4는 나눗셈의 몫이다)
  5. 자 이제, n1이 짝수였다면, n0 = 2*n4로, 홀수였다면, n0 = 2*n4+1로 처음 친구가 생각한 숫자를 맞출 수 있다.

예를 들어,  친구가 생각한 수가 n0=37이었다면, n1 = 111이 되고 홀수이다. 그 다음 n2 = 56, n3 = 168, n4 = 18이 된다. 친구는 n4를 알려주게 된다. 

 

그럼 2*n4+1 = 37이기 때문에, 친구가 제일 처음 생각한 숫자를 맞출 수 있다.

 

n0이 주어졌을 때, n1이 홀수인지 짝수인지와 n4를 구하는 프로그램을 작성하시오.

 

 

조건 및 입출력

1. 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n0으로 이루어져 있다. (0 < n0 < 1,000,000) 입력의 마지막 줄에는 0이 하나 주어진다.

2. 각 테스트 케이스에 대해서, 케이스 번호를 출력하고 n1이 짝수라면 'even', 홀수라면 'odd'를 출력하고, n4를 출력한다.

 

 

코드 (C99)
#include <stdio.h>

int main(void)
{
	long long num;
	long long counter = 1;

	while (1)
	{
		scanf("%lld", &num);

		if (num == 0)
			break;

		if (num % 2 == 0)
			printf("%lld. even %lld\n", counter, num / 2);
		else
			printf("%lld. odd %lld\n", counter, (num / 2));

		counter++;
	}
	return 0;
}

 

 

풀이 과정

문제에서 지시한 5가지 과정을 단 한 마디로 요약하면,

n0에서 2로 나눈값을 구하라는 얘기다. (소수로 표현될 시, 소수점 이하는 버림)

 

왜냐하면, 1부터 4과정을 다 하면 원래의 수가 나오기 때문이다.

 

5과정은 1-4과정을 다 하고 *2를 했을 때 홀 짝을 말해 달라는 얘기이기 때문에,

홀수면 +1을 한 값을 불러달라고 한 것이고, 그렇지 않으면 그대로 불러달라는 얘기다.

 

고로, n0값에서 /2를 해 주면 n4의 값이다. (소수 버림)

그에 따른 결과로 n1과 n4는 종속이기 때문에 n4가 짝수면 n1도 짝수고, n4가 홀수면 n1도 홀수다.

-> (홀수*2=홀수) , (짝수*2=짝수)

 

문제를 이해 했다면, 그 다음은 쉽다.

 

while문을 통해 사용자가 0을 입력하기 전까지 무한루프를 돌린다.

C언어에서 int형은 소수가 나오면 소수점 이하는 절하하기 때문에 따로 뭘 건들일 필요가 없다.

다만, 홀짝인지 판별하는 if문이 필요하다. 또한 매 시행마다 번호가 매겨져야 하므로, counter라는 변수를 만들어 매 시행마다 번호를 붙일 수 있도록 코드를 작성하면 정답이다.

 


여담

자료 구조를 공부해 봐야겠다. 백준에서 시간이 엄격한 문제는 자료구조를 배우지 않으면 절대 통과가 안된다.

내일부터 자료구조도 조금씩 들여다 봐야겠다.

 

 

 

코드가 이상하거나, 이해되지 않는 부분이 있다면 댓글 남겨주세요!

+ 더 좋은 풀이 방법이 있다면 알려주세요 :)

+ Recent posts