마음만은 새내기

항상 초심을 잃지 않고 생활하겠습니다~!

2019 수업 노트

2019-1 수업 노트 (자료구조 1 실습, 개강 6주차)

동동매니저 2019. 4. 16. 14:00
 「2019학년도 1학기」 /// 
by. 동동매니저 >_<

▶ 일자 : 2019년 04월 09일 (화)
▶ 과목 : 자료구조 1 실습
▶ 담당 교수님 : SCH 컴소공 성낙준 교수님

※ 실습 내용을 요약해보면?
▶ 순환 함수를 응용한 문제 풀어보기

※ 오늘 실습한 문제!!
★ 문제 1
▶ 정수를 입력받고, 소수 여부를 판별하는 프로그램을 작성하시오. (순환 함수 필수!!)

★ 문제 2
▶ 10진수를 16진수로 변환하는 프로그램을 작성하시오. (순환 함수 필수!!)

※ 문제를 풀어보면? (소스 코드)
★ 문제 1
▶ 소수 : 1과 자기 자신만을 약수로 갖는 수, 1은 제외
▶ 짝수 중 소수는 2가 유일함. (그러므로 짝수로 나누어 볼 필요가 없음.)
▶ 소수 판별을 위한 가장 빠른 방법 : N이 2~sqrt(N) 사이의 모든 소수로 나누어 떨어지지 않으면, 소수로 판정
▶ 단, 여기에서는 2~sqrt(N) 사이의 모든 홀수로 나누어보았음. (단, 떨어지는 경우가 생기면 바로 종료)
#include <stdio.h>

// 소수 판정 함수 (순환)
// n : 입력받은 수
// i : 나누는 수
int is_prime(int n,int i){
	int k=i; // 변수 k에 i의 값을 저장
	// 자신보다 큰 가장 작은 홀수를 k에 저장
	if(i%2==0) k+=1;
	else k+=2;
	if(n<2) return 0; // 만약 2보다 작으면, 소수가 아님
	else if(i*i>n) return 1; // 만약 sqrt(n)까지 비교했으면, 소수로 판단
	else if(n%i==0) return 0; // 만약 나누어 떨어지면, 소수가 아님
	else return is_prime(n,k); // 다음 홀수로 나누어 봄
}

int main(void){
	int num; // 소수를 판단할 수
	printf("정수 입력 : ");
	scanf("%d",&num);
	// 2부터 나누어보고, 다음부터는 홀수로 나누어 봄
	if(is_prime(num,2)) printf("%d은(는) 소수입니다.\n",num); // 소수인 경우
	else printf("%d은(는) 소수가 아닙니다.\n",num); // 소수가 아닌 경우
	return 0;
}

★ 문제 2
▶ 0~F까지의 문자들을 붙여서 하나의 문자열로 저장 후, 연산을 통해 해당되는 값을 꺼내서 사용하는 방식
▶ 단, 역순으로 저장되므로, 뒤집어서 출력해야 함.
#include <stdio.h>
#include <string.h>

char H[]="0123456789ABCDEF"; // Mapping 테이블 (0~15)
char hex[9]={0}; // 16진수 문자열을 저장

// 16진수 변환 함수 (순환)
void to_hex(int n,int i){
	if(n>0){
		hex[i]=H[n%16]; // 해당 값의 문자를 저장
		to_hex(n/16,i+1); // 순환 호출
	}
}

int main(void){
	int num; // 변환할 정수
	int i;
	printf("정수 입력 : ");
	scanf("%d",&num);
	to_hex(num,0); // 16진수로 변환
	printf("16진수 값 : ");
	// 함수에 의해 생성된 문자열이 역순으로 저장되므로, 뒤집어서 출력
	for(i=strlen(hex)-1;i>=0;i--) putchar(hex[i]);
	puts("");
	return 0;
}

※ 수업을 듣고 나서 느낀 점!!
▶ 순환을 응용한 추가적인 알고리즘을 직접 구현해보려니 막상 어려웠음.
▶ 반복문으로 풀 수 있는 문제를 순환으로 풀어보려니 어려웠지만, 여기에 추가적인 생각을 얹어서 무사히 마칠 수 있었음.

※ 기타 참고 사항!!
▶ 없음