[CNU] Mogakco

[2021_동계_모각코] 01주차(12/30)

cleoN 2020. 12. 30. 23:23

01주차(12/30) 목표
자료구조와 함께 배우는 알고리즘 입문 C언어편_5장 재귀 알고리즘
Power JAVA_CH07 클래스와 객체


 

> 자료구조와 함께 배우는 알고리즘 입문 C언어편_5장 재귀 알고리즘

 

재귀란 어떤 사건이 자기 자신을 포함하고 나서 다시 자기 자신을 사용하여 정의될 때 재귀적(recursive)이라고 한다.

 

순차곱셈 구하기

1. 0! = 1

2. n > 0 이면 n! = n x (n -1)!

 

#include <stdio.h>

int factorial(int n) {
	if (n > 0) {
		return n * factorial(n - 1);
	}
	else 
		return 1;
}

int main(void) {
	int x;
	printf("정수를 입력하세요 : ");
	scanf_s("%d", &x);
	printf("%d의 순차곱셈 값은 %d입니다.\n", x, factorial(x));
	return 0;
}

//chapter05_factorial.c

 

재귀호출 : factorial 함수는 factorial 값을 구하기 위해 다시 factorial 값을 호출한다.

 

유클리드 호제법

 

x = az와 y = bz를 만족하는 정수 a, b와 최대의 정수 z가 존재할 때 z를 gcd(x, y)라고 할 수 있다. 다시 말해 최대공약수는 y가 0이면 x이고, y가 0이 아니면 gcd(y, x%y)로 구한다.

 

#include <stdio.h>

int gcd(int x, int y) {
	if (y == 0)
		return x;
	else
		return gcd(y, x % y);
}

int main(void) {
	int x, y;
	puts("두 정수의 최대공약수를 구합니다.");
	printf("두 정수를 입력하세요 :");
	scanf("%d %d", &x, &y);
	printf("최대공약수는  %d입니다.\n", gcd(x, y));
	return 0;
}

//chapter05_euclid.c

재귀 알고리즘의 분석

#include <stdio.h>

void recur(int n) {
	if (n > 0) {
		recur(n - 1);
		printf("%d\n", n);
		recur(n - 2);
	}
}

int main(void) {
	int x;
	printf("정수를 입력하세요 : ");
	scanf("%d", &x);
	recur(x);

	return 0;
}

//chapter05_recur.c

재귀 알고리즘의 비재귀적 표현

void recur(int n) {
Top :
	if (n > 0) {
		recur(n - 1);
		printf("%d\n", n);
		n = n - 2;
		goto Top;
	}
}

//chapter05_recur_nr1.c
void recur(int n) {
	IntStack stk;
	Initialize(&stk, 100);
Top :
	if (n > 0) {
		Push(&stk, n);
		n = n - 1;
		goto Top;
	}
	if (!IsEmpty(&stk)) {
		Pop(&stk, &n);
		printf("%d\n", n);
		n = n - 2;
		goto Top;
	}

	Terminate(&stk);
}

//chapter05_recur_nr2.c

하노이의 탑

#include <stdio.h>

void move(int no, int x, int y) {
	if (no > 1)
		move(no - 1, x, 6 - x - y);
	printf("원반[%d]를(을) %d 기둥에서 %d 기둥으로 옮김\n", no, x, y);

	if (no > 1)
		move(no - 1, 6 - x - y, y);
}

int main(void) {
	int n;
	printf("하노이의 탑\n원반 개수 : ");
	scanf("%d", &n);
	move(n, 1, 3);

	return 0;
}

//chapter05_hanoi.c

8퀸 문제

#include <stdio.h>

int pos[8];

void print(void) {
	for (int i = 0; i < 8; i++)
		printf("%2d", pos[i]);
	putchar('\n');
}

void set(int i) {
	for (int j = 0; j < 8; j++) {
		pos[i] = j;
		if (i == 7)
			print();
		else
			set(i + 1);
	}
}

int main(void) {
	set(0);
	return(0);
}

//chapter05_queen_b.c
#include <stdio.h>

int flag[8];
int pos[8];

void print(void) {
	for (int i = 0; i < 8; i++)
	printf("%2d", pos[i]);
	putchar('\n');
}

void set(int i) {
	for (int j = 0; j < 8; j++) {
		if (!flag[j]) {
			pos[i] = j;
			if (i == 7)
				print();
			else {
				flag[j] = 1;
				set(i + 1);
				flag[j] = 0;
			}
		}
	}
}

int main(void) {
	for (int i = 0; i < 8; i++)
		flag[i] = 0;
	set(0);

	return 0;
}

//chapter05_queen_bb.c
#include <stdio.h>

int flag_a[8];
int flag_b[15];
int flag_c[15];
int pos[8];

void print(void) {
	for (int i = 0; i < 8; i++)
		printf("%2d", pos[i]);
	putchar('\n');
}

void set(int i) {
	for (int j = 0; j < 8; j++) {
		if (!flag_a[j] && !flag_b[i + j] && !flag_c[i - j + 7]) {
			pos[i] = j;
			if (i == 7)
				print();
			else {
				flag_a[j] = flag_b[i + j] = flag_c[i - j + 7] = 1;
				set(i + 1);
				flag_a[j] = flag_b[i + j] = flag_c[i - j + 7] = 0;
			}
		}
	}
}

int main(void) {
	for (int i = 0; i < 8; i++) {
		flag_a[i] = 0;
	for (int i = 0; i < 15; i++) {
		flag_b[i] = flag_c[i] = 0;
		set(0);

		return 0;
	}
	}
}

//chapter05_eight_queen.c

> Power JAVA_CH07 클래스와 객체

 

1. 객체 지향이란?

데이터와 절차를 하나의 덩어리로 묶어서 생각하는 방법

2. 객체 지향 프로그래밍의 특징

캡슐화 : 관련된 데이터와 알고리즘이 하나의 묶음으로 정리되어 있어야 한다. -> 클래스

정보 은닉 : 내부의 데이터를 캡슐로 보호하는 역할

상속 : 기존의 코드를 재활용하기 위한 기법으로 이미 작성된 클래스를 이어받아서 새로운 클래스를 생성하는 기법

다형성 : 객체가 취하는 동작이 상황에 따라서 달라지는 것을 의미

3. 객체

객체 안의 변수를 필드라고 하고 객체 안의 함수를 메소드라 부름.

4. 메시지

객체들이 다른 것들과 상호 작용하기 위해서 필요한 통신 메커니즘

ex) Car1.setSpeed(100);

메세지를 받는 객체.메세지의 이름(메세지의 매개변수);

5. 클래스

같은 종류의 객체들은 모두 하나의 설게도로 만들어진다.

클래스로부터 만들어지는 각각의 객체를 그 클래스의 인스턴스라고 한다.

6. 메소드

클래스 안에 정의된 함수

7. 객체의 일생

객체는 힙이라는 메모리 공간에 만들어진다. 두 개의 참조 변수가 하나의 객체를 가리킨다. 쓰레기 수집기에 의해서 수거된다.

8. 문자열 객체의 생성과 사용

문자열은 객체

자바에서 객체를 생성하는 방법은 키워드 new를 사용하는 것이다

객체가 생성된 후에 객체의 메소드를 사용하려면 도트 연산자를 사용한다.


01주차 회고록

 

이전에 배웠던 C언어와 지난 1년 동안 주로 사용했던 JAVA를 다시 복습하며, 종강 이후로 잊고 있었던 기억을 다시 끄집어냈다. 아무래도 책에 나와있는 예제 위주로 공부하다보니 더 쉽고 간단했지만, 방학에도 이렇게 공부할 수 있어서 다음 학기에 큰 도움이 될 것 같다. 첫 시간이라 간단한 코드를 위주로 쳤지만 다음부터는 백준 알고리즘 문제들도 하나씩 다뤄볼 생각이다. 이대로만 쭉 해서 다음 학기에는 프로그래밍 실습을 어려워하지 않고 잘 해내고 싶다!