본문 바로가기

Coding Tests/백준 온라인

C언어_백준 온라인 2588번


<첫 번째 시도>

#include<stdio.h>
#include<string.h>
void reverse(char arr[])
{
	int len = strlen(arr);
	for (int i = 0; i < len / 2; i++)
	{
		char temp = arr[i];
		arr[i] = arr[len - i - 1];
		arr[len - i - 1] = temp;

	}
}




int main(void)
{
	char A[4], B[4];
	scanf("%s", A);
	scanf("%s", B);
	int i = 0;
	int carry = 0;
	int sum[5];
	reverse(A);
	reverse(B);

	for (i = 0; i < 3; i++);
	{
		sum[i] = ((B[0] - '0') * (A[i]))%10 + carry;
		carry = sum[i] / 10;
	}
	if (carry >= 1)
		sum[3] = carry;

	 
	printf("%d", Y - 543);
	return 0;
}

 

문자열을 이용하고 reverse함수를 만들어줘서 문제를 풀어나가려고 하였다가 방법을 바꾸었다.


<두 번째 시도>

#include<stdio.h>
int main(void) 
{
	int A;
	char B[4]; 
	int i;
	char sum[5] = { 0 };
	int total = 0;
	scanf("%d %s", &A, B);

	for (i = 0; i <3; i++){
		sum[i] = (A) * (B[2 - i]);
	}



	printf("%s\n", sum[0]);
	printf("%s\n", sum[1]);
	printf("%s\n", sum[2]);
	return 0;

}

<세 번째 시도>

#include<stdio.h>
int main(void)
{
	int A;
	int B[5];
	scanf("%d", &A);
	for(int i = 0;i<3;i++)
	scanf("%1d", &B[i]);

	int i = 0;
	int g[5];
	char arr1[5];
	char arr2[5];
	char arr3[5];
	for (i = 0; i < 3; i++) {
		g[i] = A * B[2 - i];
	}

	printf("%d\n", g[0]);
	printf("%d\n", g[1]);
	printf("%d\n", g[2]);

	char 

}

% 1d를 사용하여 배열 B의 각 요소에 하나씩 값을 입력받고자 하였고, for문을 통해 곱셈을 세 번 진행하여 주었다. 

그러면 남은 과제는 각 곱셈의 결과에 따른 덧셈인데, 곱셉의 원리 그리고 위 문제의 그림에 따라서 이 세 값을  단순히 그냥 더해주면 안 된다는 것을 알 수 있는데, 처음에는 이를 배열 요소들을 뒤집어 각각 일의 자리와 십의 자리가 비어있는 g [1] , g [2]의 비어있는 부분에 0을 배열 요소 값으로 대입하여 문자열 덧셈을 진행하려 하였다. 그러나 이 값을 문자열로 바꾸어 연산을 하는데 조금 어려움이 있었다. 그래서 밑의 방법으로 다시 시도를 하였다.

 

<정답>

#include<stdio.h>
int main(void)
{
	int A;
	int B[5];
	scanf("%d", &A);
	for (int i = 0; i < 3; i++)
		scanf("%1d", &B[i]);

	int i = 0;
	int g[5];

	for (i = 0; i < 3; i++) {
		g[i] = A * B[2 - i];
	}

	printf("%d\n", g[0]);
	printf("%d\n", g[1]);
	printf("%d\n", g[2]);
	printf("%d", g[0] + g[1] * 10 + g[2] * 100);
	return 0;
}

그림을 보고 뒤에 0을 붙이면 되지 않나? 생각을 하였고, 생각해보니 10에 10을 곲하면 100으로 뒤에 0이 붙는데, 이 수에 10과 100을 곱하면 문제의 그림에 있는 것처럼, 그리고 곱셈의 원리에 따른 연산을 구현할 수 있다는 생각에 위의 풀이대로 각각 10을 곱해주고 100을 곱해주었다.


<참고 : %1d의 사용>

int A;
	int B[5];
	scanf("%d", &A);
	for(int i = 0;i<3;i++)
	scanf("%1d", &B[i]);

위의 코드가 아닌 밑의 코드를 작성했다면, % 1d를 의도와는 다르게 잘못 사용한 것이다. 한 글자(숫자)씩 나누어 입력을 받고 싶어서 사용을 했는데, 밑의 코드는 예를들어 365를 입력할 때, 기대한 것은 B [0] = 3 , B [1] = 6, B [2] = 5인데, 실상은 배열의 이름 B는 배열 B의 첫 번째 요소 값 즉 B [0]의 주소 값을 가리키므로 B [0] = 3만 저장이 될 뿐 다른 요소들에 하나씩 나뉜 수들이 입력이 될 방법이 없어 B [0]의 값만 저장이 되게 된다. 그러므로 위의 코드처럼 반복문을 통해 하나씩 나누어진 수들이 골고루 입력받아지게끔 만들어 주어야 한다.

<의도와는 다른 %1d의 사용>

int A;
	int B[5];
	scanf("%d", &A);
	scanf("%1d", &B);