본문 바로가기

Coding Tests/코드업

코드업 1046번(자료형의 변환)

정수 3개를 입력받아 합과 평균을 출력해보는 문제이다.
단, -2147483648 ~ +2147483647

 

-2147483648 ~ +2147483647는 값의 표현 범위를 나타내는데,

 int형(4바이트) 이나 long형(4바이트)이 이에 해당한다. int형 정수를 입력받으라는 소리인 것 같은데, 굳이?라는 생각이 들기도 하지만 정수 자료형 중 자주 쓰는 char형(1바이트, -128 이상 +127 이하)도 있으니 그런 것이라 생각한다.


첫 번째 나의 풀이인데, 단순한 문제에 비해 너무 복잡하게 푼듯한 느낌이든다. 그리고 avr을 구하는 과정에서 3으로 나누었는데, 잘못된 풀이라는 결과가 나왔다. 이는 3.0으로 나누어 주면 해결이 되는데, avr과 arr [ ]의 배열 요소들의 자료형이 일치하지 않아 생기는 문제라고 생각한다.(정수 자료형  != 실수 자료형)

#include<stdio.h>
int main(void)
{
	int arr[3];
	int i = 0;
	double avr;
	int total = 0;

	scanf("%d %d %d", &arr[0], &arr[1], &arr[2]);
	avr = (arr[0] + arr[1] + arr[2]) / 3.0;

	for (i = 0; i < 3; i++)
	{
		total += arr[i];
	}
	printf("%d\n%.1lf", total, avr);
	return 0;
}

두 번째로 풀어보았는데, 또 배열을 이용해 풀어 보았다.  그동안에는 선언을 무조건 먼저 해주고, 그다음 입력이나 출력을 해줘야 한다고 알고 있었는데, 이문제에 대한 다른 풀이도 그렇고 내가 직접 해본 결과 이렇게 선언이 다 끝나지 않았는데, scanf문이 들어갈 수 있다는 것을 이 문제를 통해 알게 되었다. 이 부분에 대해서는 잘못 알고 있던 만큼 다시 공부해 보아야겠다. 그리고 코드의 중간 부분에 avr = (double)total이 있는데, 이는 total이 int형이기 때문에, double형인 avr의 값에 맞춰 형 변환을 시켜준 것이다. (double) total는 double형이다.

#include<stdio.h>
int main(void)
{
	int arr[3];
	int i = 0;
	double avr;
	
    scanf_s("%d %d %d", &arr[0], &arr[1], &arr[2]);
	int total = arr[0] + arr[1] + arr[2];
	
    avr = (double)total / 3;
	
    printf("%d\n%.1lf", total, avr);
	return 0;
}

세 번째의 풀이인데 내가 생각하는 가장 이상적인 풀이인 것 같다. 간단한 문제를 복잡하게 푸는 것이 아니라 

빠르고 간결하게 풀 수 있도록 노력을 해야 겠다는 생각이 든다.

#include<stdio.h>
int main(void)
{
	int a, b, c;
	scanf("%d %d %d", &a, &b, &c);
	int sum = a + b + c;
	float avr = (float)sum / 3;
	printf("%d\n%.1f", sum, avr);
	return 0;
}

여기서 3.0으로 나누어도 정답이다.