1) 2진법컴퓨터 과학컴퓨터 과학은 문제 해결에 대한 학문문제 해결은 입력(input)을 전달받아 출력(output)을 만들어내는 과정, 이 중간에 있는 과정이 바로 컴퓨터 과학.이 컴퓨터과학의 첫 번째 개념, 표현 방법바로 2진법이다. 2진법일상에서 사용하는 0,1,
컴퓨터가 문자, 사진, 영상, 음악 등 다양한 정보를 처리하는 방식을 설명할 수 있습니다.ASCII유니코드RGB컴퓨터가 숫자를 입력받아서 출력하는 것은 쉽습니다. 근데 우리는 숫자로 대화하는 것이 아닌 문자로 대화를 하죠? 메신저를 보내거나 기록을 남길 때요.그렇다면,
우리가 일상 생활에서 하는 일들을 컴퓨터가 이해할 수 있는 알고리즘으로 표현할 수 있습니다.효율적인 알고리즘에 대해 설명할 수 있습니다.알고리즘의사코드\*정의컴퓨터가 입력을 받고 그 입력을 처리한 후 출력 형태로 만드는 처리 과정을 규칙적으로 순서대로 나열한것을 의미합
C로 “hello, world”를 출력하는 프로그램을 만들 수 있습니다.stdio.hclang컴파일러가장 오래되고 전통적인 순수 텍스트기반 언어입니다.C로 작성한 코드는 "파일이름.c"로 저장해야합니다.\*스크래치 \*예시source code: 우리가 직접 작성한 코드
C로 문자열 형식을 가진 변수를 선언하고 출력하는 프로그램을 만들 수 있습니다.형식지정자stringmake\*스크래치 블록사용자의 입력을 받고 사람의 이름을 불러서 인사를 합니다.스크래치의 ask함수와 가장 비슷한 것은 get_string함수(in CS50 Sandbo
조건문과 루프를 c로 작성할 수 있습니다.intifwhileforcounter라는 변수 생성 및 0 저장int: 변수가 정수라는 것을 알려줌counter: 변수의 이름0: 0으로 저장(초기화)변수의 값을 1씩 증가(= 변수에 할당한다는 의미)counter = count
다양한 데이터 타입과 형식 지정자를 나타내는 방법을 학습합니다.다양한 연산자를 이용하여 조건문을 표현하는 방법을 학습합니다.charlongfloatdouble%&&\|\|아래 목록은 변수의 데이터 타입으로 사용할 수 있는 것들입니다.bool: 불리언 표현, (예) Tr
사용자 정의 함수와 중첩 루프를 작성할 수 있습니다.사용자 정의 함수중첩 루프여러 번 반복해서 사용하게 되는 코드를 이 함수를 이용하면 쉽고 간편하게 불러올 수 있기에 효율적이고 간단한 코드가 작성이 가능합니다.\*예시1(단순 반복|)\*예시2(for문 루프 이용)\*
컴파일링의 네 단계를 설명할 수 있습니다.컴파일링어셈블링링킹전처리기가 전처리한 소스 코드를 생성하고 나면 그 다음 단계는 컴파일입니다. 컴파일러라고 불리는 프로그램은 C 코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일합니다.어셈블리는 C보다 연산의 종류가 훨씬 적
디버깅 하는 여러 방법을 설명할 수 있습니다.디버깅help50debug50\*버그코드에 들어있는 오류로 프로그램의 실행 실패 혹은 원하는대로 동작 방해을 일으킵니다.\*디버깅코드에 있는 버그를 식별하여 고치는 과정으로 디버거라는 프로그램을 사용하여 디버깅합니다.디버거는
C에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지합니다.bool: 불리언, 1바이트char: 문자, 1바이트int: 정수, 4바이트float: 실수, 4바이트long: (더 큰) 정수, 8바이트double: (더 큰) 실수, 8바
우리가 특정 자료형의 변수를 선언하면 이는 메모리상 어딘가에 특정 크기만큼의 자리를 차지하게 됩니다.만약 비슷한 종류의 값을 모아서 저장하고 싶다면 어떻게 해야 할까요? 메모리상에서 여러 값을 연이어서 저장하고 사용하는 방법과 그 이점을 알려드립니다.배열을 정의하고 사
문자열이 C에서 정의되는 방식과 메모리에 저장되는 방식을 설명할 수 있습니다.문자문자열우리가 여지껏 사용한 문자열(string) 자료형의 데이터는 사실 문자(char) 자료형의 데이터들의 배열이었습니다. string s = “HI!”; 과 같이 문자열 s가 정의되어 있
문자열을 탐색하고 일부 문자를 수정하는 코드를 구현할 수 있습니다.문자열 안에 포함되어 있는 문자를 검색하기 위해서는 어떻게 해야 할까요? 또 특정 문자를 다른 문자로 바꾸기 위해서는 어떻게 해야 할까요? 이런 질문들에 답해보도록 하겠습니다.strlentoupper사용
명령행 인자를 받는 프로그램을 C로 작성할 수 있습니다.make나 clang과 같은 프로그램을 실행할 때 컴파일하고자 하는 코드 외에도 컴파일 후 저장하고자 하는 파일명과 같이 추가적인 정보이런 정보들을 명령행 인자 라고 부릅니다. 우리가 작성하는 프로그램에서도 명령행
우리는 메모리의 구조, 자료형, 배열과 같은 기본적인 개념을 익혔고 이 블로그에선 여태까지 배운 내용을 활용하여 검색이나 정렬과 같은 문제를 푸는 알고리즘을 배워 보겠습니다.먼저 주어진 배열 속에서 특정 값을 찾는 방법부터 시작해 보겠습니다.배열은 한 자료형의 여러 값
우리가 프로그램을 작성한 후에 실행하면 작업이 완료될때까지 어느정도 시간이 소요됩니다. 아주 간단한 프로그램인 경우에는 실행 시간을 걱정할 필요가 없지만, 처리하는 데이터가 많아지고 처리하는 작업이 복잡해질수록 실행 시간은 매우 중요해집니다.특정 알고리즘을 작성하였을
찾고자 하는 자료를 검색하는 데 사용되는 다양한 알고리즘이 있습니다. 선형검색은 원하는 원소가 발견될 때까지 처음부터 마지막 자료까지 차례대로 검색합니다.이렇게 하여 선형 검색은 찾고자 하는 자료를 찾을 때까지 모든 자료를 확인해야 합니다.선형 검색 알고리즘은 정확하지
버블 정렬은 두 개의 인접한 자료 값을 비교하면서 위치를 교환하는 방식으로 정렬하는 방법을 말합니다.버블 정렬은 단 두 개의 요소만 정렬해주는 좁은 범위의 정렬에 집중합니다.이 접근법은 간단하지만 단 하나의 요소를 정렬하기 위해 너무 많이 교환하는 낭비가 발생할 수도
보통 배열이 정렬되어 있으면 정렬되지 않은 배열보다 더 쉽게 탐색할 수 있습니다.정렬을 위한 알고리즘 중 선택정렬을 배열 안의 자료 중 가장 작은 수(혹은 가장 큰 수)를 찾아 첫 번째 위치(혹은 가장 마지막 위치)의 수와 교환해주는 방식의 정렬입니다.선택 정렬은 교환
O(n^2): 선택 정렬, 버블 정렬O(n log n)O(n): 선형 검색O(log n): 이진 검색O(1)Ω(n^2): 선택 정렬, 버블 정렬Ω(n log n)Ω(n)Ω(log n)Ω(1): 선형 검색, 이진 검색여기서 버블 정렬을 좀 더 잘 할 수 있는 방법을 알아
main 안에서 프로그램을 작성하면서 필요한 순간에 호출하여 사용합니다. main이라는 함수 안에서 또 다른 함수를 사용한 것입니다.이 사실을 알게 되었을 때, 우리는 함수가 본인 스스로를 호출해서 사용할 수 있는지에 대해 의문을 가질 수 있습니다.이에 대한 대답은 할
전화번호부의 분할 정복 탐색처럼 데이터를 반으로 나누어간다는 것과 공통점이 있는 방법인 병합 정렬(합병 정렬)이 있습니다.병합 정렬은 원소가 한 개가 될 때까지 계속해서 반으로 나누다가 다시 합쳐나가며 정렬을 하는 방식입니다.그리고 이 과정은 재귀적으로 구현되기 때문에
컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많습니다. 컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문입니다. 16진수와 일상생활에서 우리가 사용하는 10진수와 비교하면 그 차이를 알 수 있습
컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많습니다. 컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문입니다. 16진수와 일상생활에서 우리가 사용하는 10진수와 비교하면 그 차이를 알 수 있습
이 연산자를 이용해서 포인터 역할을 하는 변수를 선언할 수도 있습니다.위 코드를 보면 정수형 변수 n에는 50이라는 값이 저장되어 있습니다.그리고 \*p라는 포인터 변수에 &n 이라는 값, 즉 변수 n의 주소를 저장합니다.int p 에서 p앞의 는 이 변수가 포인터라는
우리는 여태껏 문자열을 저장하기 위해 CS50 라이브러리에 포함된 string 자료형을 사용하였었습니다.아래와 같이 s에 “EMMA”라는 값을 저장한다고 생각해 봅시다.문자열은 결국 문자의 배열이고, s0, s1, s2, … 와 같이 하나의 문자가 배열의 한 부분을 나
위 코드를 실행하면, s라는 포인터의 값, 즉 “EMMA”라는 문자열의 가장 첫 값인 “E”에 해당하는 메모리 주소를 출력하게 될 것입니다. 그렇다면 아래 코드들은 무엇을 출력할까요?s가 가리키는 곳을 시작으로 “EMMA”라는 문자열로 이루어진 문자들의 배열이 있으니,
문자열을 복사하기 위해 아래 코드를 실행하면 어떻게 될까요?사용자에게 입력값을 받아 string s에 저장하고, string t를 s로 정의합니다.그리고 t의 첫 번째 문자를 toupper 함수를 이용하여 대문자로 바꾼다면 s와 t는 각각 어떻게 출력 될까요?입력값으로
malloc 함수를 이용하여 메모리를 할당한 후에는 free라는 함수를 이용하여 메모리를 해제해줘야 합니다.그렇지 않은 경우 메모리에 저장한 값은 쓰레기 값으로 남게 되어 메모리 용량의 낭비가 발생하게 되기 때문이죠.이러한 현상을 ‘메모리 누수’라고 일컫습니다.valg
아래와 같은 코드가 있습니다. 함수 swap은 정수 a와 b를 입력받아 그 값을 바꾸는 일을 수행합니다.main 함수에서는 x에 1, y에 2를 입력하고 swap 함수를 통해 그 두 값을 바꾸려고 하고 있습니다.과연 의도대로 잘 바뀌어서 출력이 될까요?void swap
스택은 우리가 여태껏 많이 써왔던 get_int나 get_string 과 같은 함수에서도 사용됩니다.만약 이런 함수들을 직접 구현한다면 아래와 같은 코드가 될 것입니다.위 코드들에서 scanf라는 함수는 사용자로부터 형식 지정자에 해당되는 값을 입력받아 저장하는 함수입
위 코드에서 main 함수를 보면 사용자로부터 입력을 받는 것을 알 수 있습니다.여기서는 파일의 이름을 입력으로 받을 예정입니다. 만약 argc가 2가 아니라면, 파일명이 입력되지 않았거나 파일명 외의 다른 인자가 입력되었기 때문에 1(오류)을 리턴하고 프로그램을 종료
main 함수 안의 첫 두 줄에서는 포인터 x와 y를 선언합니다.그리고 x에는 malloc 함수를 이용해서 int 자료형 크기에 해당하는 메모리를 할당합니다.그 다음에는 x와 y 포인터가 가리키는 지점에 각각 42와 13을 저장합니다.여기서 문제가 될 만한 부분은 \*
단순하게 현재 배열이 저장되어 있는 메모리 위치의 바로 옆에 일정 크기의 메모리를 더 덧붙이면 되겠지만, 실제로는 다른 데이터가 저장되어 있을 확률이 높습니다.따라서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮겨줘야 합니다.따
데이터 구조는 우리가 컴퓨터 메모리를 더 효율적으로 관리하기 위해 새로 정의하는 구조체입니다.일종의 메모리 레이아웃, 또는 지도라고 생각할 수 있습니다.이번 강의에서는 데이터 구조중 하나인 연결 리스트에 대해 알아보겠습니다.배열에서는 각 인덱스의 값이 메모리상에서 연이
앞서 정의한 구조체를 활용해서 실제로 연결 리스트를 구현해보도록 하겠습니다.아래 코드의 내용과 각 주석을 따라가 보세요.