C언어로 스택(Stack) 구현하기
·
자료구조(Data Structure)
스택 일단 stack의 구조는 이렇다. 데이터를 넣을땐 위에서 넣고, 데이터를 빼낼때 또한 위에서 뺀다. 아래에서 데이터를 넣고, 뺄 수 없다. 항상 위에서만! 후입선출(last in, first out)을 구조를 가진다. 스택의 예시 1)함수의 호출 2)웹 브라우저에서 뒤로가기 등등.. 예를들어, 재귀함수를 호출한다고 가정해보자. 함수는 실행이 끝나면 자신을 호출한 함수로 되돌아가야한다. 만약 factorial(3)이라는 함수를 호출한다면 factorial(2)가 실행되고, factorial(2)함수가 끝나면 factorial(3)함수로 돌아간다는 뜻이다. 스택은 복귀할 주소를 기억하는데 사용된다. 스택에서 입출력이 이루어 지는 가장 윗부분을 stack top이라고 한다. 가장 밑 스택은 bottom ..
순환 - 팩토리얼, 거듭제곱값, 피보나치 수열, 하노이 탑
·
자료구조(Data Structure)
순환 순환이란 어떤 알고리듬이나 함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 방법이다. 순환적인 문제를 해결하는데 적합하고, '반복'을 사용하는 것 보다 간결하고 이해가 쉬울 때도 있다. 하지만, 함수를 호출하고 기억장소를 할당해야 하기때문에 반복에 비해서 비효율적이고 속도가 느릴 수 있다. 순환의 예 순환은 순환적인 문제를 해결하는데 적합하다고 했다. 예를 들어, 팩토리얼(factorial)계산은 순환적이다. 팩토리얼의 정의를 살펴보면, n!을 계산하기 위해 n에 (n-1)!을 곱한다. 즉, n!을 정의하기 위해서 다시 (n-1)!을 사용한다는 것이다. 이러한 것을 '순환적'이다 라고 한다. 이것을 재귀함수를 이용해서 풀어보자. int factorial(int n) { if(n
C언어 - 함수의 포인터
·
C프로그래밍/개인 공부
함수 포인터 지금까지 우리는 포인터를 주로 변수를 가르키는데 사용했다. 하지만, 포인터는 함수도 가르킬 수 있다. 함수도 실행되는 주소를 가진다. 일반적인 포인터는 변수가 저장되어있는 주소를 가르키지만, 함수 포인터는 함수가 시작되는 주소를 가르킨다. 함수 포인터는 이렇게 선언한다. int (*pf)(int, int); int형이고 매개변수로 int, int를 갖는 함수 포인터 pf. 라는 뜻이다. 예를들어, sub함수를 정의하고 sub함수를 가르키는 함수포인터를 설정해보자. int sub(int, int); //함수원형 정의 int (*pf)(int, int); //함수 포인터 정의 pf = sub; //함수의 이름을 함수 포인터에 대입. 어려울 것이 없다. 여기서 눈여겨 봐야할 점은, pf = sub..
C언어 - 포인터의 배열, 배열의 포인터
·
C프로그래밍/개인 공부
포인터의 배열 포인터의 배열이란, 배열의 원소안에 포인터들이 들어가는 배열이다. int *ap[10]; //10개의 주소가 들어갈 수 있는 포인터 배열 선언 포인터 배열은 이렇게 선언한다. 포인터의 배열을 사용하면 문자열을 저장할 때, 장점이 있다. 예를 들어, computer라는 2차원배열을 선언하고 원소를 넣어보자. char computer[3][8] = { "Mac", "Samsung", "Lenovo" }; 보통 이렇게 배열을 선언하고 초기화 할 것이다. 하지만, 이렇게 한다면 "Samsung"문자열은 8바이트를 다 사용하지만, Mac은 3바이트만 사용하게된다. 즉, "Mac"이란 문자열은 5바이트를 사용하지 않기때문에 메모리의 '낭비'가 생긴다. 그렇다면, 포인터의 배열을 사용하여 문자열을 저장..
C언어 - 이중 포인터
·
C프로그래밍/개인 공부
이중 포인터 포인터는 다른 변수의 주소를 가르킨다고 학습했었다. 포인터도 변수이기 때문에, 포인터가 포인터를 가르킬 수 있다. 그것을, 포인터의 포인터. 즉, '이중 포인터'라고 한다. 간단한 일반적인 포인터의 예를 보자, int i = 10; int *p = &i; 이것은 지금까지 학습했던, 일반적인 포인터이다. 포인터 p는 변수 i를 가르키게 된다. 이중 포인터는 이렇게 표현한다. int i = 10; int *p = &i; int **q = &p; 포인터 p는 변수 i의 주소를 가르키고, 이중포인터 q는 포인터p의 주소를 가르킨다.(포인터 p도 변수이기 때문에 주소를 갖는다.) 텍스트로는 이해가 힘드니 그림으로 다시 알아보자. 참조연산자 * 주소연산자 & 를 활용해서 누가 어떤 값을 갖는지 확인해보..
BOJ - 3003(C++)
·
백준
https://www.acmicpc.net/problem/3003 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 첫째 줄에 동혁이가 찾은 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수가 주어진다. 이 값은 0보다 크거나 같고 10보다 작거나 같은 정수이다. www.acmicpc.net 풀이 #include int main(void) { using namespace std; int arr[7] = {1, 1, 2, 2, 2, 8}; int a = 0; for(int i = 0; i > a; cout a에서 입력된다.