목록C (25)
Prosto
'포인터(Pointer) - 특정 변수(의 주소)를 가리키는 역할을 하는 변수!' 프로그래밍을 하다보면 main에서 한번 만들어둔 변수 값을 다른 함수에도 그대로 사용하고, 또 변경하고싶은 경우가 있을 수 있습니다.같은 지역(main 내)에 있는 변수라면 사용, 변경은 간단하지만,같은 지역이 아닌 경우(main 외 호출된 함수)는 해당 값을 임시 변수로 받아 반환하는 식으로 처리하게 됩니다.이런 때 좀 더 효율적으로 처리할 수 있게 해주는 게 포인터를 사용하는 큰 이유로 볼 수 있습니다.(사실 더 큰 이유는 메모리를 할당받고 해당 공간을 기억하는데 사용되지만, 그건 포인터 공부가 어느정도 된 후에 보면 금방 이해될 것이라 생각됩니다!) 간단한 소스와 함께 위의 설명을 다시 확인해볼까요?#include//..
'const, 변경할 수 없게 상수처럼 만들어라.' 이번 시간에는 const(상수화)에 대하여 알아보도록 하겠습니다.const는 실제 문제를 내놓기도 애매하니예제 두 가지를 가지고 const에 대하여 배워보도록 하겠습니다. const, 들어보셨을 수도 있고, 처음 보셨을 수도 있습니다.그럼 이 const 키워드는 어떤 때 사용하고, 왜 사용하는지 알아볼까요? 일단, 상수화라고 하니 상수란 무엇인지 알아봅시다. 간단한 정의지만,우리는 프로그래밍을 배우며 사용하고 있으니, 프로그래밍으로 살펴볼까요? C언어에서int num;이라고 선언하면 무슨 말인가요? 이름이 num인 int형인 변수를 선언한 거죠?여기서는 보면 우리가 num을 변수라고 부릅니다.num=5; num=10; num=200; 이렇게 일정 범위 ..
배열에 대한 연습 문제를 풀어보는 네 번째 시간입니다. (이번엔 1차원 배열)전 시간까지는 규칙을 찾고 로직을 구성하는 문제들이었지만,이번 시간부터는 배열과 반복문, 조건문을 이용하여 특정 문제를 해결하면 됩니다.그럼, 이번에는 순위를 구하는 문제를 풀어보도록 하겠습니다. 문제에 대한 설명과, 완성된 소스는 제공합니다.소스에서 설명이 필요한 부분은 주석이나 별도의 코멘트를 달아 설명하도록 하겠습니다. 문제는 두 가지입니다. 첫 번째는 배열이 가지고있는 숫자가 큰 순서대로 등수(순위)를 주고, 두 번째는 배열이 가지고있는 숫자가 작은 순서대로 등수(순위)를 주는 것입니다. (배열이 가지고 있는 숫자는 편의상 점수라고 생각하며 진행하겠습니다.) 문제1. 0번 학생부터 9번 학생까지 10명의 점수를 담고있는 ..
재귀적 호출 함수를 이해하기 위해선사용자 정의 함수를 먼저 알고있어야 합니다.(잘 모르신다면 아래 글을 참고해주세요.) '사용자 정의 함수의 이해와 예제, 문제 -C언어' 이번에는 재귀적 호출 함수에 대하여 알아보도록 하겠습니다. 재귀적 호출 함수란 무엇일까요? 말그대로 재귀(再歸 : 원래의 자리로 되돌아가거나 되돌아옴) 함수입니다. 함수에서 다른 함수를 호출하는 게 가능하다는 걸 알고 계시죠? 여기서 달라지는 부분이 바로 다른 함수를 호출하는 것이 아닌 자기 자신을 다시 호출한다는 것입니다. Recursive라는 함수를 만들어 예를 들어볼까요? void Recursive(){ //내용 Recursive();} 같은 식으로 구성된 함수입니다. 이런 함수를 메인에서 ( int main(void) { Rec..
'사용자 정의 함수 - 이미 만들어진 함수를 사용하듯 직접 새로운 함수를 정의하여 사용하는 방법!' 프로그래밍을 하다보면 같은 작업을 변수 몇 가지만 바뀌어서 처리하거나,특정 기능을 만들어서 필요할 때마다 사용하고 싶은 경우가 있습니다.그런 때 사용할 수 있도록 해주는 게 사용자 정의 함수입니다. 지금까지 우리가 배웠던 것들을 그대로 함수로 만들 수 있습니다.예를 들면, 두 수를 전달해주면 더하기 기능을 해주는 함수를 만들 수도 있고, 구구단 중 특정 단을 출력해주는 기능을 하는 함수를 만들 수도 있습니다. 실제로 게임에서도 캐릭터가 이동하는 기능을 하는 함수, 공격을 하는 함수, 체력을 표시해주는 함수같이 여러 개의 함수를 만들어서 사용하게 됩니다. 함수에도 지금까지 했던 것처럼 일정한 규칙이 있지만,..
'빠르게 정렬하는 방법으로 가장 많이 사용되는 퀵정렬' 퀵 정렬은 빠른 정렬이나 퀵 소트(Quick Sort)라고도 부릅니다. 퀵 정렬(Qucik Sort)는 데이터를 정렬하는 방법 중 하나입니다. 데이터를 분할(Divide)하고 분할된 부분 별로 이동하는 정복(Conquer) 과정을 반복하여 거쳐 정렬하는 방법입니다. (지금까지의 정렬들과 달리 조금은 복잡합니다만 보고, 직접 해보며 이해할 수 있을 겁니다.) 성능을 Big O로 표기한다면 average, best = O(n log n)이고, worst = O(n^2)입니다. 일반적으로는 O(n log n)의 성능을 내주지만, 피봇(중심점이) 항상 최솟값이나 최댓값으로 잡힌다면 최악의 성능인 O(n^2)이 나옵니다. 참고로 지금까지 했던 (선택, 삽입,..
'검색할 범위를 반으로 줄여가며 찾아가는 이분 검색(Binary Search)' 이분 검색은 검색할 자료를 반씩 나누어 나머지 반만 검색하는 방식을 반복하여 자료를 찾는 검색(탐색) 방법입니다. 이 이분 검색을 이용하여 자료를 찾는다면 빠른 속도로 원하는 자료를 찾을 수 있습니다. (단, 이분 검색은 정렬되어있는 데이터에 사용할 수 있습니다.) (정렬 방법은 블로그 내의 다른 글을 참고하시면 도움이 될 것 같습니다.) 성능을 Big O로 표기한다면 O(log n)입니다. 자료가 2개라면 1번, 4개(2^2개)라면 2번, 8개(2^3개)라면 3번, 16개(2^4개)라면 4번, ... 1,024개(2^10개)라면 10번, 1,048,576개(2^19개)라면 최대 19번이면 찾습니다. 굉장히 빠르죠? 실제 배..
'맞는 위치에 삽입시켜가며 정렬하는 삽입정렬' 삽입정렬은 Insertion Sort라고도 부르며 데이터 정렬 방법 중 하나입니다. 키(key) 값을 가지고 정렬시키는 삽입 정렬은 두 번째 자료부터 시작하여 그 앞의 자료들과 비교하여 알맞은 위치로 삽입하는 형태의 정렬입니다. (배열로 보는 경우 삽입이라면 뒤의 자료들은 한 칸씩 밀리는 형태가 되겠죠?) (아래 데이터 이동 그림을 보시면 이해하시기 더 좋을 것이라 생각됩니다.) 여러 회전을 반복하여 정렬하는 방법입니다. 첫 번째 회전에서는 두 번째 자료를 키 값으로 가지고 앞의 자료들을 하나씩 비교합니다. 두 번째 자료의 앞 자료는 첫 번째 자료 하나밖에 없으니 하나만 확인하면 됩니다. 첫 번째 자료가 키 값보다 크다면 두 번째 자료를 첫 번째 자료로 바꿔..
'보글보글 거품 같이 차례차례 정렬하는 버블정렬' 버블정렬은 거품정렬이나 버블소트(Bubble Sort)라고도 부릅니다. 버블정렬은 데이터 정렬을 하는 방법 중 하나입니다. 첫 번째 자료와 두 번째 자료, 두 번째 자료와 세 번째 자료, 세번째와 네 번째 자료를 비교하는 식으로 정렬을 진행합니다. (아래 그림 보시면 이해가 빠를 겁니다.) 여러 회전을 반복하여 정렬하는 방법입니다. 첫 번째 회전에서는 첫 번째 자료와 두 번째 자료를 비교하여 첫 번째 자료가 더 큰 경우 첫 번째와 두 번째 자료를 바꿉니다. (두 번째가 더 큰 경우는 안 바꿈 ) 그리고 두 번째 자료와 세 번째 자료를 비교하여 위와 같은 작업을 해줍니다. 마찬가지로 세 번째와 네 번째, 그렇게 마지막 자료까지 비교해줍니다. (그렇다면 결과..
'선택하여 차례대로 정렬하는 선택정렬' 선택 정렬은 데이터를 정렬하는 방법 중 가장 기본적인 방법으로 첫 번째 자료부터 마지막 자료까지 하나씩 순서대로 정렬해가는 방식입니다. 오름차순이라면 가장 낮은 숫자가 첫 번째, 가장 높은 숫자가 마지막이 되겠죠? (내림차순이라면 그 반대의 결과가 나오겠죠?) 그렇다면 이 선택 정렬은 어떻게 이루어지는 걸까요? 오름차순을 기준으로 이야기하자면 이렇습니다. 첫 번째 위치인 가장 낮은 값을 찾기 위해서 두 번째부터 마지막까지 낮은 값을 확인하여 첫 번째 값을 결정합니다. 그 과정에서 현재 위치의 값보다 작은 값을 만나면 서로의 값을 교환해줍니다. 그 후 두 번째로 낮은 수를 찾기 위해서 세 번째부터 마지막까지 현재 두 번째 자리의 수보다 낮은 값이 있는지 확인하죠. 마..