별의 공부 블로그 🧑🏻‍💻

🗒️ C (28)

728x90
  1. 2022.12.13 [C++] 3개의 숫자 중에서 최댓값 구하기 (max(a, b, c))

    3개의 숫자 중에서 최댓값 구하기 (max(a, b, c)) 들어가며 @max()@ 함수의 매개변수로 2개의 숫자밖에 넣질 못한다. 따라서 3개 이상의 숫자를 비교하려면 @max(a, max(b, c))@와 같이 사용해야 한다. 하지만 다음과 같이 간단하게 3개의 숫자 중 최댓값을 구하는 커스텀 함수를 작성하여 사용할 수 있다. 방법 int myMax(int a, int b, int c) { return a > b ? (a > c) ? a : c : (b > c) ? b : c; } a > b ? (a > c) ? a : c : (b > c) ? b : c 예제 #include using namespace std; int myMax(int a, int b, int c) { return a > b ? (a..

  2. 2022.03.27 [정보처리기사 실기] 프로그래밍 기출 문제 정리 (2017년~2022년) 4

    프로그래밍 기출 문제 정리 (2017년~2022년) 정보처리기사 실기 기출 문제 중에서 프로그래밍(C, Java, Python)과 관련된 문제를 정리해 본다. 이 문제들은 복원을 한 것으로, 실제 출제된 문제와 다를 수 있다. 2017년 1회 문제 1 Q. 다음 Java 언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오. public class Test001 { public static void main(String[] args) { int[] a = {3, 4, 10, 2, 5}; int temp; for (int i = 0; i max) { max = a[i]; } if ( ( ) < min) { min = a[i]; } } System.out.printf("%d\n", max); System..

  3. 2022.03.04 [정보처리기사 실기] 10. 프로그래밍 언어 활용 4

    10. 프로그래밍 언어 활용 (1) 데이터 입·출력 데이터 입·출력의 개요 데이터 입·출력 : 키보드로부터 데이터를 입력받아 화면이나 파일로 출력하는 것 이 페이지에서는 C와 Java의 기본적인 프로그램 구조를 이해하고, 다음과 같은 내용이 포함된 프로그램 코드를 읽고 해석하는 방법을 배운다. 헝가리안 표기법 자료형 C언어의 입출력 함수 : scanf, printf Java의 입출력 함수 : Scanner, nextInt, print, printf, println 서식 지정자와 제어 문자 연산자의 우선순위 C 문제 예제 : 다음은 키보드로 6과 4를 입력 받아 두 수의 덧셈 결과를 출력하는 프로그램이다. 출력 결과를 확인하시오. #include main() { int i, j, k; scanf("%d %..

  4. 2021.06.08 컴퓨터 일반 : 주요 고급 언어의 특징

    컴퓨터 일반 주요 고급 언어의 특징 JAVA 객체 지향 언어 분산 네트워크 환경에 적용이 가능함. 멀티스레드 기능을 제공하므로 여러 작업을 동시에 처리할 수 있음. 운영체제 및 하드웨어에 독립적 이식성이 강함. 바이트 코드 생성으로 플랫폼에 관계없이 독립적으로 동작할 수 있음. C UNIX 운영체제 제작을 위해 개발 저급 언어와 고급 언어의 특징을 갖춘 중급 언어 ALGOL 수치 계산이나 논리 연산을 위한 과학 기술 계산용 언어 PASCAL과 C 언어의 모체 BASIC 초보자도 쉽게 사용할 수 있는 문법 구조를 갖는 대화형 언어 COBOL 사무 처리용 언어 영어 문장 형식으로 구성되어 있어 이해와 사용이 쉬움. FORTRAN 과학 기술 계산용 언어 수학과 공학 분야의 공식이나 수식과 같은 형태로 프로그래..

  5. 2021.05.08 배열의 유형 및 선언 방법

    배열의 유형 배열의 유형 정적 배열(Static Array) 선언된 블록이 끝나면 소멸됨. 스택(Stack) 메모리 영역에 할당됨. 함수를 벗어날 때, 자동으로 해제됨. 동적 배열(Dynamic Array) 프로그래머가 생성할 시점과 해제할 시점을 자유롭게 설정할 수 있음. 힙(Heap) 영역에 할당됨. 사용자가 직접 해제하기 전까지 유지됨. 두 가지 유형 중에서 필요에 따라 적절한 배열을 선택하여 사용하면 됨. 두 가지 유형 모두 다양한 연산에서 동일한 성능 을 나타냄. 이러한 배열은 C 언어에서 도입되었기 때문에 C 스타일 배열(C Style Array) 라고도 함. 배열의 선언 방법 정적 배열 int arr[size]; // C, C++ 동적 배열 int* arr = (int*)malloc(size..

  6. 2021.01.29 main(int argc, char* argv[])

    1 2 3 4 5 6#include using namespace std; int main(int argc, char* argv[]) { } main 함수는 프로그램에서 최초로 실행이 된다.main 함수의 매개변수로는 int형의 argc, char* 형의 argv[]가 있다. main 함수의 매개변수에 대한 설명은 각각 다음과 같다. int argc : main 함수에 전달되는 데이터의 개수char* argv[] : main 함수에 전달되는 실제적인 데이터, char형 포인터 배열로 구성됨. argv[0]에는 프로그램의 절대 경로가, argv[1] 부터는 입력받은 문자가 대입됨. > example.cpp 1 2 3 4 5 6 7 8 9 10 11#include using namespace std; int ..

  7. 2020.12.28 프로그램 실행 시간 측정 방법 (clock())

    12345678910#include // clock() : ms 단위로 시간 측정 void main() { clock_t start = clock(); // algorithm clock_t end = clock(); std::cout

  8. 2020.12.26 단축 평가 논리 계산법(Short-Circuit Evaluation)

    *단축 평가 논리 계산법(Short-Circuit Evaluation) AND 혹은 OR의 연산에 있어서 결과가 확실하게 예측이 되었을 때 뒤에 나머지 연산을 실행하지 않고 답을 내버리는 것AND 연산의 경우false가 우선 나와버리면 AND 뒤에 나오는 연산은 생략OR 연산의 경우true가 우선 나와버리면 OR 뒤에 나오는 연산은 생략#include using namespace std; int main() { bool result; // AND result = printf("") && printf("ABC"); result = printf("1") && printf("ABC"); cout

  9. 2020.11.02 버블 정렬(Bubble Sort)

    *버블 정렬(Bubble Sort) 12345678910111213141516171819202122232425#include #define SIZE 5 int main() { int i, k; int list[SIZE] = {16, 7, 9, 1, 3}; // 배열의 요소 정렬 for (k = 0; k

  10. 2020.10.25 scanf() 입력 버퍼 비우는 방법

    *scanf() 입력 버퍼 비우는 방법 scanf()를 사용하다 보면, 입력을 정상적으로 받지 못할 경우가 생기게 된다.이러한 종류의 문제는 입력 버퍼(stdin Buffer)와 관련된 문제가 대부분이며, 이 문제를 해결하기 위해서는 입력 버퍼를 비워줘야 한다.입력 버퍼를 비우는 방법을 이 글에 총정리 해보았다. #pragma warning(disable: 4996) #include int main() { char ch; scanf("%c", &ch); printf("1, %c\n", ch); scanf("%c", &ch); printf("2, %c\n", ch); return 0; } a 1, a 2, ab 1, a 2, b 무슨 일이 일어났는지 확인해 보기 위하여 다음과 같이 코드를 수정해서 프로그램..

  11. 2020.10.12 배열을 사용하지 않고 입력 받은 정수의 각 자리의 수 합하기

    다음과 같이 입력 받은 정수 N의 각 자리의 수를 배열을 사용하지 않고 반복문을 사용하여 합할 수 있다. 1234567891011121314#include int main() { int N, sum = 0; scanf("%d", &N); for (int i = N; i != 0; i /= 10) { sum += (i % 10); } printf("정수 N의 각 자리수의 합 : %d", sum); return 0;} 1234515 원리는 다음과 같다. 입력 받은 정수 N을 0이 될 때까지 10으로 계속 나누어 준 후, 10으로 mod 연산을 수행하면 된다.그리고 나온 값들을 모두 더해주면 끝! [Step 1] 12345 12345 % 10 = 5 (다섯 번째 자리의 수) [Step 2] 12345 / 10..

  12. 2020.09.18 조건문이나 함수 없이 반올림 하기

    조건문이나 round() 함수를 사용하지 않고 간단한 조건만으로 반올림을 할 수 있는 방법이 있다. 예를 들어 5자리의 정수를 받아서 100의 자리에서 반올림한 결과 값을 출력하는 프로그램을 작성할 때, (100의 자리의 숫자 >= 5) * 1000의 값을 더해주면 된다. >= 5 이라는 조건을 넣어주어 100의 자리의 숫자가 5 이상일 경우 1(True), 그렇지 않을 경우 0(False)이 나오도록 한 후 그 값을 1000과 곱하여 더해주면 되는 것이다. 1234567891011121314151617#include int main() { int input, tenThousand, thousand, hundred; scanf("%d", &input); tenThousand = input / 10000;..

  13. 2020.09.11 숫자 출력 시 앞에 0을 붙여 자리수 채우기

    C 언어에서 숫자 출력 시, 앞에 0을 붙여 자리수를 채울 수 있는 방법이 있다.printf()로 출력할 경우, 형식 지정자에 0n(n: 숫자)을 붙이면 된다. 12345678#include int main() { printf("%d\n", 125); printf("%5d\n", 125); printf("%05d\n", 125); return 0;} 125 12500125 > "%05d" 1 2 3 4 5 0 0 1 2 5

  14. 2020.07.19 Visual Studio에서 scanf() 관련 오류 메시지 없애는 방법

    *Visual Studio에서 scanf() 관련 오류 메시지 없애는 방법 Visual Studio IDE는 기본적으로 보안에 취약한 함수를 사용할 수 없도록 제한하고 있다. scanf() 함수는 보안에 취약한 함수로 분류 되었기 때문에, scanf()를 사용하여 컴파일을 할 경우 컴파일 오류로 인하여 컴파일을 수행할 수 없다. (Visual Studio는 scanf() 함수 대신 scanf_s() 함수 사용을 권장하고 있다.) _CRT_SECURE_NO_WARNINGS 를 적용하면 이러한 컴파일 오류를 없앨 수 있다. 간단히 #define _CRT_SECURE_NO_WARNINGS 를 코드에 추가하면 된다. (또는 #pragma warning(disable:4996)를 코드에 추가하면 된다. ) #de..

  15. 2020.06.18 qsort 함수 : 퀵 정렬 라이브러리 함수

    *qosrt 함수 : 퀵 정렬 라이브러리 함수 - C에서 제공하는 퀵 정렬 표준 라이브러리 함수- 사용하려면 헤더 파일을 불러와야 한다. void qsort(void *base, int num, int width, int (*compare)(const void *, const void *));base : 배열의 시작 주소num : 배열 요소의 개수width : 배열 요소 하나의 크기(바이트 단위)compare비교 함수포인터를 통하여 두 개의 요소를 비교하여 비교 결과를 정수로 반환사용자가 제공해야 함.반환값 0 : elem1이 elem2보다 크면- 사용 예 #include #include // qsort() int comp..

  16. 2020.06.08 Union-Find 알고리즘(서로소 집합 알고리즘)

    *Union-Find 알고리즘 - Disjoint-Set(서로소 집합) 알고리즘이라고 불린다. - 지금 추가하고자 하는 간선의 양끝 정점이 같은 집합에 속해 있는지를 검사하는 알고리즘.- 간선의 양끝 정점이 서로 다른 집합에 속하는 경우, 두 정점을 연결하여도 사이클이 형성되지 않는다.- Kruskal MST 알고리즘을 구현하는데 사용된다. #include #define MAX_VERTICES 100 int parent[MAX_VERTICES]; // 부모 노드int num[MAX_VERTICES]; // 각 집합의 크기 // 초기화void set_init(int n) { int i; for (i = 0; i < n; i++) { parent[i] = -1; num[i] = 1; }} // vertex가..

  17. 2017.10.06 [C] 배열의 크기를 입력 받아 해당 크기의 배열 생성하기 (동적 할당)

    배열의 크기를 입력 받아 해당 크기의 배열 생성하기 (동적 할당) 가끔. 배열의 크기를 처음부터 확정짓지 못할 경우가 많다. 또 쓰지 않는 공간이 많은 배열을 생성하여 메모리를 낭비하는 경우가 생기곤 한다. 이럴 때는 동적할당을 이용하여 사용자로부터 배열의 크기를 입력 받아 해당 크기의 배열을 생성하여 메모리를 절약할 수 있다. 아래는 예시 코드이다. #include // scanf, printf #include // malloc, free int main(void) { int *arr; // 배열 이름을 포인터 변수로 int n; // 배열의 크기를 받을 변수 int i; printf("배열의 크기 : "); scanf("%d", &n); // 배열의 크기를 받음 arr = (int *)malloc(s..

  18. 2017.06.21 [C] 탐색(Search)

    탐색(Search) [탐색이란?] - 탐색(search)은 컴퓨터가 가장 많이 하는 작업 중의 하나임. - 탐색은 컴퓨터 프로그램에서 가장 많이 사용하는 작업임과 동시에 많은 시간이 요구되므로 탐색을 효율적으로 수행하는 것은 매우 중요함. - 탐색은 기본적으로 여러 개의 자료 중에서 원하는 자료를 찾는 작업. - 탐색을 위하여 사용되는 자료 구조는 배열, 연결 리스트, 트리, 그래프 등 매우 다양할 수 있음. - 탐색 중에서 가장 기초적인 방법은 배열을 사용하여 자료를 저장하고 찾는 것. - 그러나 탐색 성능을 향상하고자 한다면 이진 탐색 트리와 같은 더욱 진보된 방법으로 자료를 저장하고 탐색해야 함. - 탐색의 단위는 항목이며, 항목은 간단하게 숫자일 수도 있고, 아니면 구조체가 될 수도 있음. - 항..

  19. 2017.06.20 [C] 해싱(Hashing)

    해싱(Hashing) [해싱이란?] - 대부분의 탐색 방법들은 탐색 키를 저장된 키 값과 반복적으로 비교함으로써 탐색하고자 하는 항목에 접근함. - 하지만 해싱은 키 값에 직접 산술적인 연산을 적용하여 항목이 저장되어 있는 테이블의 주소를 계산하여 항목에 접근함. - 해시 테이블(hash table) : 키 값의 연산에 의해 직접 접근이 가능한 구조 - 해싱(hashing) : 해시 테이블을 이용한 탐색 - 해싱은 일상생활에서의 정리 정돈으로 비유할 수 있음. - 키들의 비교에 의한 탐색 방법은 정렬이 안 되어 있으면 O(n)이고 정렬되어 있으면 O(log₂n). - 이 정도의 시간 복잡도가 허용되는 경우도 있는 반면, 어떤 경우는 더 빠른 탐색 방법이 필요함. - 해싱은 이론적으로는 O(1)의 시간 안..

  20. 2017.06.19 [C] 그래프(Graph)

    그래프(Graph) [그래프란?] - 그래프(graph) : 연결되어 있는 객체 간의 관계를 표현할 수 있는 자료 구조. 예) 지도 - 지도를 그래프로 표시하면 하나의 도시에서 다른 도시로 갈 때 최단 거리 경로가 어떤 것인지를 알고리즘을 이용해 쉽게 찾을 수 있음. - 운영 체제에서 프로세스와 자원들이 어떻게 연관되는지를 그래프로 표현하게 되면 시스템의 효율이나 교착 상태 유무 등을 알아낼 수 있음. - 그래프는 많은 문제들을 표현할 수 있는 훌륭한 논리적 도구. - 선형 리스트나 트리의 구조로는 복잡한 문제들을 표현할 수 없음. - 그래프 구조는 인접 행렬이나 인접 리스트로 메모리 에 표현되고 처리될 수 있으므로 광범위한 분야의 다양한 문제들을 그래프로 표현하여 컴퓨터 프로그래밍에 의해 해결할 수 있..

  21. 2017.06.18 [C] 정렬(Sorting)

    정렬(Sorting) - 정렬(sorting) : 물건을 크기순으로 오름차순(ascending order)이나 내림차순(descending order)으로 나열하는 것. - 정렬은 컴퓨터공학을 포함한 모든 과학 기술 분야에서 가장 기본적이고 중요한 알고리즘 중의 하나로 일상생활에서 많이 사용됨. - 정렬은 자료 탐색에 있어서 필수적임. - 일반적으로 정렬시켜야 될 대상은 레코드(record)라고 불림. - 레코드는 다시 필드(field)라고 하는, 더 작은 단위로 나누어짐. - 여러 필드 중에서 특별히 레코드와 레코드를 식별해주는 역할을 하는 필드를 키(key)라고 함. 레코드 { [필드][필드][필드][필드][필드][필드][필드][필드][필드][필드] 레코드 { [필드][필드][필드][필드][필드][필..

  22. 2017.06.17 [C] 우선순위 큐(Priority Queue)

    우선순위 큐(Priority Queue) - 컴퓨터에 우선순위의 개념이 필요할 때가 있음. 예) 네트워크 패킷 중에서 네트워크 관리와 관련된 패킷은 다른 일반 패킷보다 우선순위를 가짐. 예) 운영 시스템에서도 시스템 프로세스는 응용 프로세스보다 우선순위를 가지게 됨. - 따라서 자료 구조에서도 이러한 우선순위를 지원하는 것이 필요함. - 우선순위 큐(priority queue) : 우선순위의 개념을 큐에 도입한 자료 구조. - 보통의 큐는 선입 선출(FIFO)의 원칙에 의하여 먼저 들어온 데이터가 먼저 나가게 되지만, 우선순위 큐에서는 데이터들이 우선순위를 가지고 있고 우선순위가 높은 데이터가 먼저 나가게 됨. - 스택에 들어 있는 데이터들은 우선순위가 없음. 단지 먼저 들어간 데이터가 가장 늦게 나옴...

  23. 2017.06.01 [C] 트리(Tree)

    트리(Tree) - 선형 자료 구조(linear data structure) : 자료들이 직선과 같이 나열되어 있는 구조 (리스트, 스택, 큐 등) - 트리는 계층적인 구조(hierarchical structure) 또는 비선형 자료 구조(nonlinear data structure)를 가지고 있으며, 계층적인 자료를 표현하는 데 이용되는 자료 구조. - 인공 지능 문제에서도 트리가 사용되는데 대표적인 것으로 결정 트리(decision tree)가 있음. - 결정 트리는 인간의 의사 결정 구조를 표현하는 한 가지 방법. [트리에서 쓰이는 용어] - 노드(node) : 트리의 구성 요소 - 트리는 한 개 이상의 노드로 이루어진 유한 집합임. - 이들 중 하나의 노드는 루트(root) 노드라고 불리고, 나머..

  24. 2017.05.23 [C] 큐(Queue)

    큐(Queue) - 먼저 들어온 데이터가 먼저 나가는 구조. (선입 선출(FIFO: First-In-First-Out)) - 큐에서 삽입이 일어나는 곳을 '후단(rear)'이라고 하고, 삭제가 일어나는 곳을 '전단(front)'이라고 함. 선형 큐 (Linear Queue) - 배열로 구현된 큐. - 이해하기 쉽다는 장점이 있음. - 문제점 -> front와 rear의 값이 계속 증가만 하기 때문에 언젠가는 배열의 끝에 도달하게 되고 배열의 앞부분이 비어 있어도 사용하지 못함. 따라서 주기적으로 모든 요소들을 왼쪽으로 이동시켜야 함. (상당한 시간이 걸리고 프로그램 코딩이 복잡해짐.) 원형 큐 (Circular Queue) - 선형 큐의 문제점을 보완하기 위해 배열을 원형으로 생각하여 만든 큐. - fr..

  25. 2017.05.11 [C] 스택(Stack)

    스택(Stack) - 제일 먼저 입력된 데이터가 맨 아래에 쌓이고 가장 최근에 입력된 데이터가 가장 위에 쌓이는 구조. (후입 선출(LIFO: Last-In-First-Out) - 스택에서 입출력이 이루어지는 부분을 스택 상단(stack top)이라 하고, 반대쪽인 바닥 부분을 스택 하단(stack bottom)이라고 함. - 스택에 저장되는 것을 요소(element)라고 함. - 스택에 요소가 하나도 없을 때 스택을 공백 스택(empty stack)이라고 함. - 삽입 연산을 push 연산이라고 하고, 삭제 연산은 pop 연산이라고 함. - is_empty 연산과 is_full 연산은 스택이 공백 상태에 있는지와 포화 상태에 있는지를 검사함. - create 연산은 스택을 생성함. - peek 연산은 ..

  26. 2017.05.06 [C] 이중 연결 리스트(Doubly Linked List)

    이중 연결 리스트(Doubly Linked List) - 응용 프로그램에서의 특정 노드에서 양방향으로 자유롭게 움직일 수 있는 리스트 구조. - 하나의 노드가 선행 노드와 후속 노드에 대한 두 개의 링크를 가지는 리스트. - 링크가 양방향이므로 양방향으로 검색이 가능해짐. - 공간을 많이 차지하고 코드가 복잡해진다는 단점이 있음. - 실제 응용에서는 이중 연결 리스트와 원형 연결 리스트를 혼합한 형태가 많이 사용됨. - 헤드 노드(head node)라는 특별한 노드를 추가하는 경우가 많음. - 헤드 노드는 데이터를 가지고 있지 않은 특별한 노드를 의미함. cf) 헤드 포인터 : 리스트의 첫 번째 노드를 가리키는 포인터 - 헤드 노드가 존재하면 삽입, 삭제 알고리즘이 간편해짐. - 이중 연결 리스트에서의 ..

  27. 2017.05.02 [C] 원형 연결 리스트(Circular Linked List)

    원형 연결 리스트(Circular Linked List) - 리스트의 마지막 노드의 링크가 첫 번째 노드를 가리키는 리스트. -> 마지막 노드의 링크 필드가 NULL이 아닌 첫 번째 노드 주소가 되는 리스트. - 한 노드에서 다른 모든 노드로의 접근이 가능하다는 장점이 있음. - 노드이 삽입과 삭제가 단순 연결 리스트보다는 용이해짐. - 삭제나 삽입 시에는 항상 선행 노드의 포인터가 필요함. - 리스트의 끝에 노드를 삽입하는 연산이 단순 연결 리스트보다 효율적일 수 있음. 코드 // 원형 연결 리스트 (Circular Linked List) #include #include typedef int element; typedef struct ListNode { element data; struct ListNo..

  28. 2017.04.17 [C] 단순 연결 리스트(Singly Linked List)

    단순 연결 리스트(Singly Linked List) - 단순 연결 리스트는 노드들이 하나의 링크 필드를 가지며 이 링크 필드를 이용하여 모든 노드들이 연결되어 있음. - 마지막 노드의 링크 필드 값은 NULL. - 첫 번째 노드를 가리키는 포인터(헤드 포인터) 값만 알고 있으면 연결 리스트 안의 모든 노드에 접근이 가능함. -> 하나의 단순 연결 리스트는 첫 번째 노드를 가리키는 하나의 포인터만 있으면 충분함. - 헤드 포인터(head pointer) : 첫 번째 노드를 가리키는 포인터 코드 #include typedef int element; typedef struct ListNode { element data; struct ListNode *link; } ListNode; void error(cha..

728x90


📖 Contents 📖