일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- doit코틀린프로그래밍
- Visual Studio
- Tips프로그래밍강좌
- 연산자
- 포인터
- 이지스퍼블리싱
- c#
- Direct2D
- Windows
- 프로그래밍
- c++
- 함수
- c
- Desktop
- 리뷰
- 알고리즘
- VS ERROR
- CS
- Kotlin
- Programming
- tipssoft
- 백준
- 티스토리
- Javascript
- Win32
- 김성엽
- 배열
- 문법
- Tips강좌
- 지식나눔강좌
Archives
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
BAEKJOON 1009 : 분산처리 for C 본문
반응형
문제
재용이는 최신 컴퓨터 10대를 가지고 있다. 어느 날 재용이는 많은 데이터를 처리해야 될 일이 생겨서 각 컴퓨터에 1번부터 10번까지의 번호를 부여하고, 10대의 컴퓨터가 다음과 같은 방법으로 데이터들을 처리하기로 하였다.
1번 데이터는 1번 컴퓨터, 2번 데이터는 2번 컴퓨터, 3번 데이터는 3번 컴퓨터, ... ,
10번 데이터는 10번 컴퓨터, 11번 데이터는 1번 컴퓨터, 12번 데이터는 2번 컴퓨터, ...
총 데이터의 개수는 항상 a^b개의 형태로 주어진다. 재용이는 문득 마지막 데이터가 처리될 컴퓨터의 번호가 궁금해졌다. 이를 수행해주는 프로그램을 작성하라.
이 문제는 숫자의 규칙성을 찾는 문제라고 보는 것이 맞겠습니다. 긴말하지 않고 규칙성을 찾아보죠.
규칙성이 보이시나요? 다시 한번 보겠습니다.
같은 색의 테두리로 묶은 부분이 반복되는 패턴입니다. 반복적으로 곱해 값을 구할 필요가 없는 것입니다. 따라서 아래 코드처럼 기본 데이터를 보관하는 변수를 작성하겠습니다.
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