F.R.I.D.A.Y.

BAEKJOON 1009 : 분산처리 for C 본문

DEV/Algorithm

BAEKJOON 1009 : 분산처리 for C

F.R.I.D.A.Y. 2019. 4. 6. 04:52
반응형

문제

 재용이는 최신 컴퓨터 10대를 가지고 있다. 어느 날 재용이는 많은 데이터를 처리해야 될 일이 생겨서 각 컴퓨터에 1번부터 10번까지의 번호를 부여하고, 10대의 컴퓨터가 다음과 같은 방법으로 데이터들을 처리하기로 하였다.

 1번 데이터는 1번 컴퓨터, 2번 데이터는 2번 컴퓨터, 3번 데이터는 3번 컴퓨터, ... ,

 10번 데이터는 10번 컴퓨터, 11번 데이터는 1번 컴퓨터, 12번 데이터는 2번 컴퓨터, ...

 총 데이터의 개수는 항상 a^b개의 형태로 주어진다. 재용이는 문득 마지막 데이터가 처리될 컴퓨터의 번호가 궁금해졌다. 이를 수행해주는 프로그램을 작성하라.

 

1009번: 분산처리

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 정수 a와 b가 주어진다. (1 ≤ a < 100, 1 ≤ b < 1,000,000)

www.acmicpc.net


 이 문제는 숫자의 규칙성을 찾는 문제라고 보는 것이 맞겠습니다. 긴말하지 않고 규칙성을 찾아보죠.

규칙성이 보이시나요? 다시 한번 보겠습니다.

일의자리 옆의 숫자 1-10은 승수입니다

 같은 색의 테두리로 묶은 부분이 반복되는 패턴입니다. 반복적으로 곱해 값을 구할 필요가 없는 것입니다. 따라서 아래 코드처럼 기본 데이터를 보관하는 변수를 작성하겠습니다.

	char ml[10] = { 1,4,4,2,1,1,4,4,2,1 }; // 각 1-10까지 반복길이
	char ret[10][4] = {// 1-10까지의 순행
		 {1,0,0,0} // 1
		,{2,4,8,6} // 2
		,{3,9,7,1} // 3
		,{4,6,0,0} // 4
		,{5,0,0,0} // 5
		,{6,0,0,0} // 6
		,{7,9,3,1} // 7 
		,{8,4,2,6} // 8
		,{9,1,0,0} // 9
		,{10,0,0,0}// 10
	};

 이 값을 기반으로 처리를 진행하면 됩니다.


 최종 코드. 주석을 보고 이해가 되지 않는 부분은 댓글 달아주시면 설명해드리겠습니다.

#include <stdio.h>
#include <math.h>
#include <malloc.h>

typedef struct INPUT { // 밑과 승수를 저장하는 구조체입니다.
	int coef;
	int sq;
}input;

int main(void) {

	char ml[10] = { 1,4,4,2,1,1,4,4,2,1 }; // 각 1-10까지 반복길이
	char ret[10][4] = {// 1-10까지의 순행
		 {1,0,0,0} // 1
		,{2,4,8,6} // 2
		,{3,9,7,1} // 3
		,{4,6,0,0} // 4
		,{5,0,0,0} // 5
		,{6,0,0,0} // 6
		,{7,9,3,1} // 7 
		,{8,4,2,6} // 8
		,{9,1,0,0} // 9
		,{10,0,0,0}// 10
	};

	int row;
	scanf("%d", &row); // 열의 개수를 받습니다.
	// 열의 개수만큼 구조체 공간을 동적할당합니다.
	input* value = (input*)malloc(sizeof(input) * row); 
	
	// 순서대로 값을 받습니다.
	for (int i = 0; i < row; ++i) {
		scanf("%d %d", &value[i].coef, &value[i].sq);
	}

	// coef = 밑을 불러오는 임시변수
	// sq   = 승수를 불러오는 임시 변수
	int coef, sq;

	for (int i = 0; i < row; ++i) {
		// 값을 불러옵니다.
		coef = value[i].coef;
		sq = value[i].sq;

		coef %= 10; // 10으로 나눕니다. 1의 자리를 구하기 위함입니다.
		coef = (coef ? coef : 10) - 1;
		// 0이 나오면 10에서 그렇지 않으면 coef 값 그대로에서 -1 해줍니다.
		printf("%d\n", ret[coef][(sq - 1) % ml[coef]]);
		/* 순환값을 가지고 있는 ret의 coef, 즉 밑에 해당하는 위치에서 몇번째
		// 순환인지 확인을 합니다.
		// (sq - 1) % ml[coef]
		//  >> 승수를 특정 밑의 순환 개수로 나눕니다. 이때, 
		//     sq - 1을 해주는 이유는 아래와 같습니다.
		//     1 % 4 = 1 | 2 % 4 = 2 | 3 % 4 = 3 | 4 % 4 = 0
		//     처음 나머지가 0이 나와야하므로 1을 빼서
		//     0 % 4 = 0 | 1 % 4 = 1 | 2 % 4 = 2 | 3 % 4 = 3
		//     으로 처리합니다.
		*/

	}

	free(value); // 할당받은 메모리를 해제합니다.
	return 0;
}

 여기에서 더 간소화 할 방법은 꽤 있을겁니다.

728x90
반응형

'DEV > Algorithm' 카테고리의 다른 글

BAEKJOON 10845 : 큐 for C  (0) 2019.10.31
BAEKJOON 9012 : 괄호 for C  (0) 2019.10.27
BAEKJOON 4673 : 셀프 넘버 for C  (0) 2019.10.11
BAEKJOON 1065 : 한수 for C  (0) 2019.10.11
BAEKJOON 2839: 설탕 배달 for C  (0) 2019.04.05
Comments