큐(Queue)란?


 큐는 리스트의 한쪽 끝에서만 삽입과 삭제가 일어나는 스택과는 달리 리스트의 한쪽 끝에서는 원소들이 삭제되고 반대쪽 끝에서는 원소들의 삽입만 가능하게 만든 순서화된 리스트. 가장 먼저 리스트에 삽입된 원소가 가장 먼저 삭제되므로 선입 선출()인 FIFO(first in first out) 리스트라고 한다.




[그림 7-28] 큐 구조

[네이버 지식백과]  (컴퓨터 개론, 2013. 3. 10., 한빛아카데미(주))


특징

 

ㆍ한쪽에서는 입력만 다른 한쪽에서는 출력만 가능함.(입구와 출구가 다름)

ㆍ먼저 입력한값이 먼저 출력 → First Input First Out  → FIFO 라고불림



 구현 소스




WRITTEN BY
Who1sth1s

,

스택(Stack)이란?


 스택(stack)은 모든 원소들의 삽입(insert)과 삭제(delete)가 리스트의 한쪽 끝에서만 수행되는 제한 조건을 가지는 선형 자료 구조(linear data structure)로서, 삽입과 삭제가 일어나는 리스트의 끝을 top이라 하고, 다른 한쪽 끝을 bottom이라 한다. 스택의 top에 새로운 원소를 삽입하는 것을 push라 하고, 가장 최근에 삽입된 원소를 의미하는 스택의 top으로부터 한 원소를 제거하는 것을 pop이라 한다.





특징

 

ㆍTop이라고 불리는 한쪽 끝에서만 삽입 삭제가 행해짐.(입구와 출구가 같음)

ㆍ나중에 입력한값이 가장 먼저 출력 → Last Input First Out  → LIFO 라고불림



 구현 소스








Stack보고서.hwp



WRITTEN BY
Who1sth1s

,

WRITTEN BY
Who1sth1s

,

2차원 배열이란?

 2차원 배열은 이전에 배웠던 배열의 확장이다.

이전에 배웠던 배열이 

int arr[1]; 

이라면 오늘 배울 2차원 배열은 위 배열에서 아래와 같이조금 확장한 것이다.

int arr[1][2];

이처럼 이전에 배운 배열은 1차원 배열이라고 하고 오늘 배울 배열은 2차원 배열이라고 한다.

차이점은 index가 하나 늘어난것과 저장공간이 많아졌다는것 뿐이다. 아래의 사진을 보면 이해가 쉬울것이다.


[그림 7-5] 2차원 배열의 표현

[그림 7-5] 2차원 배열의 표현

 

 

 

[네이버 지식백과]다차원 배열 (컴퓨터 개론, 2013.3.10, 한빛아카데미(주))





2차원 배열의 선언과 저장


자료형 변수명[열][행]

예)int arr1[2][2]; char arr2[4][3];

     0  1 2              0 1  2  3  4 

  0 □ □ □          0 □ □ □ □ 

  □ □ □          1 □ □ □ □ 

  2 □ □ □          2 □ □ □ □ 

arr1              arr2 


위와 같이 각 배열에 행(가로 한줄)과 열(세로 한줄)이 생긴다. 



2차원 배열의 값 대입

배열이 

int arr[1][2]; 와 같을때 아래의 그림처럼 나온다


[그림 7-5] 2차원 배열의 표현






[네이버 지식백과] 다차원 배열 (컴퓨터 개론, 2013.3.10, 한빛아카데미(주))

그렇다면 값을 어떻게 대입 시켜줄까? 

a[0][0] = 5;

a[0][1] = 5;

a[1][0] = 5;

a[1][1] = 5;

a[2][0] = 5;

a[2][1] = 5;


이렇게 하드코딩을 할수도 있지만 다음과 같이 for문을 쓰면 쉽게 선언을 할수있다.

for(i=0; i<3;i++) {

     for(j=0; j<2; j++){

   a[i] = 5;

}

 또한 이 방법 말고도 다음과 같이처음에 선언할때도 값을 대입할 수있다.

예)int arr1[1][2]= { {5, 4}, {3, 2}, {7, 8} };

         0   1  

     0  ⑤  ④  

     1  ③  ② 

     2     


2차 배열의 활용도

2차 배열을 사용함으로써 데이터의 관리를 쉽게 할수 있으며 맵(map)과같이 자료 값을 일일히 대입하기 어려운 상황에서 쓰면 좋다.



 



WRITTEN BY
Who1sth1s

,


배열이란 간단하게 말하면 변수들을 


한 데 묶어 둔것이다. 



▶그렇다면 배열이란 것을   사용 할까?

그 이유는 배열이 없다면 변수를 선언할때  

int a1, a2, a3, a4, a5, a6, a7, … 

이런식으로 매우 귀찮아지죠. 하지만 배열을 사용하면

예) int a[10];

이렇게 데이터마다 변수 이름을 따로 두지 않으므로 처리가 훨씬 수월하며. 또한 활용도도 아주 높다는 장점이 있다.



▶배열의 선언은 어떻게 할까?

자료형 변수명[갯수]

예)int arr1[100]; char arr2[10]; 



▶배열은 어떻게 저장 될까?

배열의 저장을 비유하자면 연속적으로 놓여있는 빈 박스와 비슷하다.

다음과 같이 배열을 선언하면

int a[10]; 

□ □ □ □ □ □ □ □ □ 

0  1  2  3  4  5  6  7  8  9


다음과 같은 a라는 빈 박스 10개가 뙇 하고 생기는 것과 같다.

박스 아래에 있는 번호는 Index라고 하는데 이는 몇번째 박스인지 나타내는 번호와 같다. 

이는 Index가 0번째 부터 시작 해서 9까직 총 10개의 빈 박스가 있는것이다.(1부터 시작하는게 아니란건 주의해야한다.)


예를 들면 a[2] 는 a라는 박스들중 3번째 박스를 가르킨다.


이제 어떻게 저장되는지 알았다면 이제 이 박스 안에다가 값을 넣어보자. 


▶배열에다가 값을 어떻게 넣을까?

int a[10]; 

□ □ □ □ □ □ □ □ □ 

0  1  2  3  4  5  6  7  8  9

여기서 만약에 내가 3번째 박스에다가 5라는 값을 넣고 싶으면 a[3] = 5; 만 해주면 된다. 

그럼 모든 박스에 값을 다 넣어주자.

a[0] = 5;

a[1] = 5;

a[2] = 5;

a[3] = 5;

a[4] = 5;

… 

그렇다 미친짓이다. 그렇다면 이짓을 어떻게 쉽고 간단하게 할 수있을까?

바로  for문이다

for(i=0; i<10;i++) {

a[i] = 5;

이렇게 for문으로 i값을 증가시켜주고 a배열의 인덱스에 i값을 넣어주면 상당히 효율적으로 배열에다가 값을 넣을 수가 있다.

또한 처음에 배열을 선언할때도 다음과 같이 값을 넣을 수 있다.

예)int arr1[5]= {9, 4, 5, 7, 1};


           ⑨  ④  ⑤  ⑦  ①

 0   1   2   3   4



그러므로 이 짱짱 좋은 배열을 효과적으로 잘 사용해보자.


WRITTEN BY
Who1sth1s

,

이진 탐색이란?

이진 탐색(binary search)이라는 말 그대로 탐색하는 방법중 하나인데 순차 탐색과는 다르게 정렬된 데이터 집합을 이분화하면서 탐색하는 것이다.

 

예를들면, 가나다순으로 정렬되어 있는 전화번호부에서 임의의 사람에 대한 전화번호를 찾는 경우가 있다.



[그림 8-5]의 정렬된 데이터 집합에서 이진 탐색을 이용해 데이터 15를 탐색하는 과정을 살펴보자.

[그림 8-5] 이진 탐색을 위한 데이터 집합

① 중간에 위치한 데이터인 11과 찾고자 하는 15가 같은지 비교한다.

② 중간에 위치한 데이터인 11보다 찾고자 하는 데이터인 15가 크므로 중간 데이터 11의 오른쪽에 위치한 데이터들에 대해 이진 탐색을 수행한다.

③ 탐색 영역의 중간에 위치한 데이터인 17과 찾고자 하는 15가 같은지 비교한다.

④ 중간에 위치한 데이터인 17보다 찾고자 하는 데이터인 15가 작으므로 중간 데이터 17 왼쪽에 위치한 데이터들에 대해 이진 탐색을 수행한다.

⑤ 탐색 영역의 중간에 위치한 데이터인 15와 찾고자 하는 15가 같은지 비교한다. 원하는 데이터이므로 탐색을 종료한다.



 

[네이버 지식백과] 이진 탐색 (컴퓨터 개론, 2013.3.10, 한빛아카데미(주))

 

내가짜본

이진탐색 소스(c언어)



이진탐색의 장점과 단점

-장점 : 이진탐색 방법은 순차탐색처럼 하나하나 일일히 값을 확인하지 않고 효과적으로 원하는 값을 찾아낼 수 있다.


-단점 : 배열이 반듯히 정렬되어 있어야 한다는 제약이있다.







WRITTEN BY
Who1sth1s

,


포인터란?

포인터는 포인터 변수를 줄여서 말하는 걸로 영어 단어(pointer)그대로 무엇을 가르킨다는 뜻입니다

포인터 변수란 일반적인 변수를 저장하는 것이 아니라 해당변수가 들어있는 주소의 값을 저장 하는 것을 말한다.예를 들어 일반변수는 a라는 이름으로 100을 저장한다고 하는 반면 포인터 변수는 a라는 변수가 메모리에 위치하는 주소를 알려주는 것이다.


포인터의 선언방법

포인터의 선언은 간단하다. 선언 할 때 변수이름 앞에 기호를 넣어 주는게 전부이다.


-인반 변수 : 타임 변수의 이름

-포인터 변수 : 타입 *포인터의 이름


)일반변수 : int a; , 포인터 변수 : int *input;

 

포인터를 선언하기만 하면 그 안에는 아무의미도 없는 쓰레기 값이 들어가게 된다

그래서 포인터 변수에다가 변수의 주소를 지정 해주어야한다변수의 주소를 지정 하는 방법은 지정할 변수 앞에다가 기호를 넣어주면 된다.


포인터 변수에 값 넣기 : 포인터 변수 = &변수


)input = &a;



백문이 불여일견 이라고 그림으로 나타내면 이러하다.


-a의 값 : 3

-a의 주소 값 : 4832

-*p의 값 : 3

-p의 값 : 4832




 

포인터를 쓰는이유& 활용도

포인터를 사용함으로써 복사본을 만들지 않고 주소만 알려줌으로써 용량 및 처리시간에서 이득을 볼 수 있습니다.

그래서 메모리가 한정적이거나 처리시간이 중요한 시스템에서 사용할 경우 도움이 됩니다.


-예를들어 배열을 선언할때 배열이 a[100000]와 같이 거대한 량의 자료를 저장할때 포인터를 사용 하여 필요한 만큼의 배열의 량을 받아서 메모리를 비효율적으로 안써도 되게 합니다.



 

 


WRITTEN BY
Who1sth1s

,

버블정렬과 선택정렬은 정렬되지 않은 배열을 정렬하는 가장 기초적이면서 방법이다.



버블 정렬(bubble sort)은 서로 이웃한 데이터들을 비교하며 가장 큰 데이터를 가장 뒤로 보내며 정렬하는 방식이다.


[그림 8-1] 정렬되지 않은 데이터

[그림 8-1] 정렬되지 않은 데이터

① 가장 작은 데이터인 1을 가장 앞에 위치한 15와 교환한다. 가장 작은 데이터가 가장 앞에 위치하게 된다.

선택 정렬

② 첫 번째 데이터를 제외한 나머지 데이터에서 가장 작은 데이터인 3을 두 번째 데이터인 11과 교환한다.

선택 정렬

③ 첫 번째, 두 번째 데이터를 제외한 나머지 데이터에서 가장 작은 데이터인 8을 세 번째 데이터인 15와 교환한다.

선택 정렬

④ 첫 번째, 두 번째, 세 번째 데이터를 제외한 나머지 데이터에서 가장 작은 데이터인 11을 네 번째 데이터인 11과 교환한다. 같은 데이터이므로 위치의 변화는 없다.

선택 정렬

⑤ 데이터들에 대한 정렬이 완료된다.

[네이버 지식백과] 버블 정렬 (컴퓨터 개론, 2013.3.10, 한빛아카데미(주))



내가짜본

버블정렬 소스(c언어)





선택 정렬(selection sort)은 정렬되지 않은 데이터들에 대해 가장 작은 데이터를 찾아 가장 앞의 데이터와 교환해나가는 방식이다. 

[그림 8-3] 정렬되지 않은 데이터

[그림 8-3] 정렬되지 않은 데이터

① 첫 번째 데이터인 15와 두 번째 데이터인 11을 비교해 큰 데이터를 뒤로 위치시킨다. 15가 크므로 둘의 위치를 바꾼다.

버블 정렬

② 두 번째 데이터인 15와 세 번째 데이터인 1을 비교하는데, 앞에 위치한 15가 크므로 둘의 위치를 바꾼다.

버블 정렬

③ 마찬가지 방식을 적용해 세 번째 데이터인 15와 네 번째 데이터인 3의 위치를 바꾼다.

버블 정렬

④ 마찬가지 방식을 적용해 네 번째 데이터인 15와 마지막 데이터인 8의 위치를 바꾼다. 가장 큰 데이터인 15가 가장 뒤에 위치하게 된다.

버블 정렬

⑤ 처음부터 다시 시작한다. 첫 번째 데이터인 11과 두 번째 데이터인 1의 크기를 비교하는데 앞에 위치한 11이 크므로 둘의 위치를 바꾼다.

버블 정렬

⑥ 마찬가지 방식을 적용해 두 번째 데이터인 11과 세 번째 데이터인 3의 위치를 바꾼다.

버블 정렬

⑦ 마찬가지 방식을 적용해 세 번째 데이터인 11과 네 번째 데이터인 8의 위치를 바꾼다. 두 번째로 큰 데이터인 11이 뒤에서 두 번째에 위치하게 된다.

버블 정렬

⑧ 처음부터 다시 시작한다. 첫 번째 데이터인 1과 두 번째 데이터인 3의 크기를 비교하는데 앞에 위치한 1이 작으므로 그대로 둔다.

버블 정렬

⑨ 두 번째 데이터인 3과 세 번째 데이터인 8의 크기를 비교하는데, 앞에 위치한 3이 작으므로 그대로 둔다. 세 번째로 큰 데이터인 8이 뒤에서 세 번째에 위치하게 된다.

⑩ 처음부터 다시 시작한다. 첫 번째 데이터인 1과 두 번째 데이터인 3의 크기를 비교하는데, 앞에 위치한 1이 작으므로 그대로 둔다. 데이터들에 대한 정렬이 완료된다.

 

[네이버 지식백과] 선택 정렬 (컴퓨터 개론, 2013.3.10, 한빛아카데미(주))



내가짜본

선택정렬 소스(C언어)






두 정렬방법의 공통점과 차이점

-공통점 : 배열을 정렬하는 기초적인 방법으로 효과적이지 못하다.


-차이점 : 버블정렬은 인접한데이터 끼리 서로 비교를 통해 서로 데이터를 바꾸어 비효율적이지만 그에비에 선택정렬은 가장 작은 값을 먼저 찾은다음 서로 데이터를 바꾸어 비교적 효율적이다.














WRITTEN BY
Who1sth1s

,