C language /wo -sdl

  • stdio.h

오늘은 10년 만에 하는건지 (사실 10년은 아님) 몇 년 만에 하는건지 오랜만에 알고리즘을 다루어보도록 하겠습니다. 평소에 엄청나게 편한 메서드를 써오고 있는 저에게 오랜만에 머리를 말랑말랑하게 만들어줄 단순 사칙연산 알고리즘입니다. 사실 쉽다고는 하지만 생각보다 푸는데에 오래걸렸네요. 2분이나...

추가 조건

쉬운 문제인 만큼 조금의 고통을 더해주기 위해서 조건을 추가했습니다.

  • 숫자 관련 데이터 형으로만 처리

이제 프로그램이 어떻게 동작하는지 살펴봅니다.

입력

먼저 입력 조건을 보겠습니다. 문제에 따르면 (1)(2)는 무조건 3자리 자연수입니다. 그렇기 때문에 입력이 선택적인 상황은 고려하지 않아도 됩니다. 여기에서 (1)을 A 그리고 (2)를 B라고 두겠습니다.

처리 과정

사람에게 친숙한 일반적인 곱셈 과정입니다. 여기 우리가 알 수 있는 것은 A 혹은 B를 한 자릿수 씩 가져와 다른 3자리 자연수(A이면 B이고 B이면 A)에 곱해주는 과정입니다. 그렇게 하면 (3), (4), (5)를 알 수 있게 됩니다. (6)의 경우에는 단순 계산으로 출력할 수 있으니 따로 처리할 필요는 없습니다.

먼저 프로그램을 몇 개의 함수로 나누겠습니다.

  1. 숫자에서 특정 자릿수를 가져오는 함수
  2. 특정 자릿수에서 원래 자릿수로 되돌려주는 함수

숫자에서 특정 자릿수를 가져오는 방법

숫자에서 특정 자릿수를 가져오는 방법은 생각보다 단순합니다. 우리의 자료형은 실수형이 아닌 정수형이기 때문에 계속해서 나누면 소숫점 아래는 데이터가 소실되게 됩니다. 그리고 10으로 나눈 나머지를 구하면 무조건 마지막 자리를 가져오게 됩니다. 그 이유는 무조건 소숫점이 나머지로 따라오기 때문입니다.

int getIndexOf(int number, int index) {
	int i;

	for (i = 0; i < index; i++) {
		number /= 10;
	}

	return number % 10;
}

다시 원래 자릿수만큼 곱해주는 함수

한 자릿수 씩 계산을 할 예정이기 때문에 천(1000)의 자릿수에 있던 숫자는 아직 1000만큼 곱해주어야 합니다. 위 함수를 응용하여 구현해줍니다.

int getOriginalIndexOf(int number, int index) {
	int i;

	for (i = 0; i < index; i++) {
		number *= 10;
	}

	return number;
}

완성하기

이제 만든 함수를 사용하여 코드를 완성해봅시다. 저와 같은 경우에는 마지막에 for 문을 사용하여 출력하기 위해서 배열을 적절히 활용했습니다.

#include <stdio.h>

int getIndexOf(int number, int index) {
	int i;

	for (i = 0; i < index; i++) {
		number /= 10;
	}

	return number % 10;
}
int getOriginalIndexOf(int number, int index) {
	int i;

	for (i = 0; i < index; i++) {
		number *= 10;
	}

	return number;
}

int main() {
	int a, b, i, l, k, t;
	int r[4] = { 0 };

	scanf("%d %d", &a, &b);

	for (i = 0; i < 3; i++) {
		t = getIndexOf(b, i);

		for (k = 0; k < 3; k++) {
			r[i] += getOriginalIndexOf(getIndexOf(a, k), k) * t;
		}
	}

	r[3] = a * b;

	for (i = 0, l = sizeof(r) / sizeof(int); i < l; i++) {
		printf("%d\n", r[i]);
	}

	return 0;
}

좋은 개발 되세요!