woonadz :)

[백준/C언어] 직각삼각형_4153번_nabi 본문

IT/백준

[백준/C언어] 직각삼각형_4153번_nabi

C_scorch 2022. 1. 14. 23:38
반응형

학습 내용

pow 함수

- 사용 방법

pow(double base, double n) : base의 n승

- 주의 사항

#include <math.h> 헤더파일을 선언해준 후 pow 함수 호출

 

sqrt 함수

- 사용 방법

sqrt(double x) : x의 제곱근

- 주의 사항

#include <math.h> 헤더파일을 선언해준 후 sqrt 함수 호출

 

처음에는 a,b,c 변수를 선언하여 각각 변의 길이를 할당하려고 했었다. 이 방법이 불가능 한 것은 아니지만 if문으로 하나 하나 판별 후 변수 할당이 필요해 코드가 쓸데없이 길어질 것 같았다.

따라서 배열을 선언해 오름차순 정렬 방식을 사용했다. 

 

1차 실패 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

#define L 3

int arr[L];
int* input();
int* sort(int *arr);
char* cal(int *arr);

int main() {
	int i,number;
	char* string;

	while (1) {
		int* numPtr = input();
		if (*numPtr == 0 && *(numPtr+1) == 0 && *(numPtr+2) == 0)
			break;
		number = sort(*numPtr);
		string = cal(*numPtr);
		printf("%s\n", string);
	}
	return 0;
}

int* input() {
	int i;

	for (i = 0; i < L; i++)
		scanf("%d", &arr[i]);
	return arr;
}

int* sort(int *arr) {
	int res,i,j;

	for (i = 0; i < L-1; i++) {
		for (j = 1; j < L; j++) {
			if (*(arr+i) < *(arr+j)) {
				res = *(arr + i);
				*(arr + i) = *(arr + j);
				*(arr + j) = res;
			}
		}
	}
	return *arr;
}

char *cal(int *arr) {
	double res;
	char r = "right", w = "wrong";
	res = pow((double)*(arr+1), 2) + pow((double)*(arr+2), 2);
	res = sqrt((double)res);

	if (*arr == res)
		return r;
	else
		return w;
}

각 기능들을 함수로 구현해 호출하고 싶었다. 하지만 포인터에 대한 이해가 부족한 탓에 런타임 에러가 발생했다.

 

 2차 실패 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

#define L 3

void sort(int* arr[], int size);

int main() {
	int arr[L],i,number;
	char* string;

	while (1) {
		for (i = 0; i < L; i++)
			scanf("%d", &arr[i]);
		if (arr[0] == 0 && arr[1] == 0 && arr[2] == 0)
			break;
		sort(arr,L);
	}
	return 0;
}

void sort(int *arr[], int size) {
	int res,i,j;

	for (i = 0; i < size-1; i++) {
		for (j = i+1; j < size; j++) {
			if (*arr[i] < *arr[j]) {
				res = *arr[i];
				*arr[i] = *arr[j];
				*arr[j] = res;
			}
		}
	}
	double cal;
	cal = pow((double)*arr[1], 2) + pow((double)*arr[2], 2);
	cal = sqrt((double)cal);

	if (*arr[0] == cal)
		printf("right\n");
	else
		printf("wrong\n");
}

입력의 문제인가하고 1차 실행 코드의 정렬 함수와 계산 함수를 합쳐 하나의 함수로 만들고 출력까지 구현했다. 하지만 이 코드도 포인터 주소를 잘못 할당해 런타임 에러가 발생했다.

 

3차 실행 코드(백준 실행 성공)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

#define L 3

void sort(int arr[], int size);

int main() {
	int arr[L],i,number;

	while (1) {
		for (i = 0; i < L; i++)
			scanf("%d", &arr[i]);
		if (arr[0] == 0 && arr[1] == 0 && arr[2] == 0)
			break;
		sort(arr,L);
	}
	return 0;
}

void sort(int a[], int size) {
	int res,i,j;

	for (i = 0; i < size-1; i++) {
		for (j = i+1; j < size; j++) {
			if (a[i] < a[j]) {
				res = a[i];
				a[i] = a[j];
				a[j] = res;
			}
		}
	}
	double cal;
	cal = pow((double)a[1], 2) + pow((double)a[2], 2);
	cal = sqrt((double)cal);

	if (a[0] == cal)
		printf("right\n");
	else
		printf("wrong\n");
}

결국 배열과 함수만으로 구현했다.. 포인터 사용에 익숙해지고 싶었지만 이론 공부가 부족했던 것 같다. 정확히는 포인터에 대해 완벽히 이해하지 못한 것 같다.

 

모각코에서도 최근 포인터 관련 문제를 몇 개 풀었는데 좀처럼 사용에 익숙해지지 않는 것 같다. 다시 책을 읽어볼 필요가 있다.

반응형