본문 바로가기

전체 글502

람다(lambda)란 무엇인가? - 알고리즘 공부를 하다보면 람다(lambda)라는 식을 자주 접하게 된다. - 도대체 람다가 무엇인지 같이 알아보자. 1. 개념 람다는 어떤 함수의 매개변수로 다른 함수를 넣고 싶을 때 사용한다. 람다는 anonymous function 이라는 명칭을 갖고 있다. 선언 없이 또는 이름 없이 사용할 수 있는 함수다. 람다의 특징은 일회성이다. 함수의 선언부가 없으므로, 한번 사용하면 그걸로 끝이다. 람다의 핵심은 지연실행 또는 지연연산이다. 이는 필요할 때만 호출하여 사용하는 방식으로 메모리상의 불필요한 연산을 줄인다는 것을 의미한다.(장점) 2. 사용법 - 예시코드를 보면서 사용법을 익혀보자. print((lambda x, y, z : x + y + z)(1, 1, 1)) a) anonymous fun.. 2021. 4. 16.
오늘의 알고리즘(4월 16일) 1. 백준, 소트인사이드, 1427번 www.acmicpc.net/problem/1427 1427번: 소트인사이드 첫째 줄에 정렬하고자하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 2. 생각해보자 숫자를 문자열로 입력받는다. 입력받은 문자열을 for문을 사용하여 문자 단위로 나눈다. 나눠진 문자를 리스트에 넣는다. 내림차순 정렬 후 재조립하여 문자열로 만든다. n = input() array = list() for data in n: array.append(data) array.sort(reverse = True) #내림차순 정렬 n = "".join(array) print(n) 3. 해설 및 코드분석 - 이번 문제의 핵심은 각 자리수를 .. 2021. 4. 16.
16. 프로세스 구조(4) - BSS와 Data 1. BSS와 Data 영역 프로세스 구조에서 Data 영역은 BSS와 Data 영역으로 나뉜다. a) BSS - 초기화 값이 없는 전역변수를 의미한다. b) Data - 초기화 값이 있는 전역변수를 의미한다. 2. 코드를 통해서 살펴보자 - 예제 코드 int global_data1; //초기화 값이 없는 변수 int global_data2 = 1; // 초기화 값이 있는 변수 int main() { int *data; data = (int *) malloc(sizeof(int)); *data = 1; printf("%d\n", *data); return 0; } - 프로세스 - 딱 두가지만 확인하자. main 함수 내부에 있는 변수(= 지역변수)는 Stack에 쌓인다. main 함수 밖에 있는 변수(=.. 2021. 4. 15.
오늘의 알고리즘(4월 15일) 1. 백준, 수 정렬하기, 2750번 www.acmicpc.net/problem/2750 2750번: 수 정렬하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. www.acmicpc.net 2. 생각해보자. 첫번째 입력 N은 입력될 숫자의 개수다. 첫번째 입력 N을 이용하여 N번의 for문을 통해 숫자를 입력 받는다. N개의 숫자는 리스트에 저장한 후 정렬 함수(sort)를 이용하여 정렬한다. n = int(input()) numbers = [] for _ in range(n): numbers.append(int(input())) numbers.sort() for .. 2021. 4. 15.
15. 프로세스 구조(3) - Heap 1. Heap 이란? Heap은 개발자에 의해 동적으로 할당되는 메모리 영역이다. 파이썬과 같은 최신언어는 동적할당을 요구하지 않는다. 하지만, 컴퓨터의 내부 요소까지 모두 조절할 수 있는 C언어의 경우 동적할당은 필수적이다. a) 어떻게 동적할당을 할까? #include #include int main() { int *data; // 포인터 변수(주소값을 갖고 있다) data = (int *) malloc(sizeof(int)); // C언어에서 int는 32bit = 4bytes의 크기를 갖는다. // data라는 변수는 heap의 메모리 공간에 올라가게 된다. *data = 1;// 포인터 변수의 주소에(= 위치에) 1을 넣는다. printf("%d\n", *data); return 0; } mal.. 2021. 4. 14.
오늘의 알고리즘(4월 14일, feat.Union Find) 1. 백준, 친구 네트워크, 4195번 www.acmicpc.net/problem/4195 4195번: 친구 네트워크 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진 www.acmicpc.net 2. 생각해보자 - 입력값은 다음과 같다. 2는 테스트 케이스의 수(N) 3은 친구 관계의 수(F) / F는 100,000을 넘지 않음 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진다. 친구 관계는 두 사용자의 아이디로 이루어져 있다 / 알파벳 대문자 또는 소문자로 길이 20 이하의 문자열 친구 관계가 생길 때마다, 두 사람의 친구 네트워크에 몇명이 있는.. 2021. 4. 14.
14. 프로세스 구조(2) - Stack - 이전 포스팅에서 배운 프로세스 구조에 대해 복습해보자. 프로세스 구조 text(= code): 소스코드가 올라가는 영역 data: 전역변수, 초기화된 데이터가 올라가는 영역 (프로그램이 종료되면 소멸) stack(= stack frame): 임시 데이터(함수 호출, 로컬변수 등 호출이 완료되면 소멸) heap: 코드에서 동적으로 만들어지는 데이터 (동적 메모리 할당 - 개발자가 직접 할당) 1. 스택에 대한 이해 프로세스에 대한 구조를 이해하기 위해서 필수적으로 이해해야 하는 부분 중 하나는 Stack 자료구조다. 스택은 프로세스의 메모리 영역 중 하나로, 복잡한 함수 호출과정을 효과적으로 처리 및 관리하는 역할을 한다. 스택의 특징은 LIFO(= Last In, First Out)인데, 데이터가 밑.. 2021. 4. 13.
오늘의 알고리즘 (4월 13일) 1. 백준, 수 찾기, 1920번 www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들 www.acmicpc.net 2. 생각해보자 첫 입력값은 숫자의 개수 N이 주어진다. 두번째 입력값에는 N개의 숫자만큼 정수가 주어진다. 세번째 입력값에는 찾을 숫자의 개수 M이 주어진다. 네번째 입력값에는 M개의 숫자만큼 정수가 주어진다. - 배열 두개를 만들어서 이중 for문을 돌려서 비교하면 될 것 같다. n = int(input()) sample = .. 2021. 4. 13.
오늘의 알고리즘 (4월 9일) 1. 백준, SHA-256, 10930번 www.acmicpc.net/problem/10930 10930번: SHA-256 첫째 줄에 문자열 S가 주어진다. S는 알파벳 대문자와 소문자, 그리고 숫자로만 이루어져 있으며, 길이는 최대 50이다. www.acmicpc.net 2. 생각해보자 이번 문제는 쉬어가는 문제다. 해시함수를 어떻게 사용하는지 알기만 하면 풀 수 있는 문제이기 때문이다. 어떻게 사용하는지 알아보자. 3. 풀이 및 코드분석 해시 함수는 암호화 작업이다. 어떤 문자를 넣었을 때, 해당 문자를 굉장히 긴 길이의 문자열로 변환시켜준다. SHA-256 는 여러 해시 알고리즘 중에서 가장 효율적(=빠름)이고 안정적인 해시 함수라고 할 수 있다. SHA-256을 안정적인 이유중 하나가 단방향성 암.. 2021. 4. 9.
13. 프로세스 구조(1) 프로세스와 컨텍스트 스위칭 스케줄러에 의해 어떤 프로세스에서 다른 프로세스로 바뀌는 과정을 컨텍스트 스위칭이라고 한다. 이 컨텍스트 스위칭을 이해하기 위해서는 프로세스의 구조에 대한 이해가 바탕이 되어야 한다. 지금부터 프로세스의 구조에 대해서 알아보겠다. 1. 프로세스 구조 - 먼저 다음과 같은 프로그램 코드가 있다고 해보자. def func(a, b): return print(a+b) c = 0 c = func(1,2) print(c) 이 코드가 실행되면 컴파일이라는 단계를 거친다. 컴파일은 기계어 또는 바이너리라는 0과 1로 된 언어로써, 컴퓨터가 이해할 수 있도록 번역되는 과정을 의미한다. - 프로세스가 실행된다는 것은 코드가 컴파일 되는 과정을 포함한다. - 그렇다면 컴파일된 코드는 어디로 가는.. 2021. 4. 9.
오늘의 알고리즘(4월 8일) 1. 백준, 5397, 키로거 www.acmicpc.net/problem/5397 5397번: 키로거 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L의 길이 ≤ 1,000,000) 강산이가 백스페이 www.acmicpc.net 2. 생각해보자 a) 문제 정보 첫줄은 테스트케이스의 개수다. 백스페이스는 - 로 표현한다. 화살표는 로 커서의 움직임을 표현한다. 나머지 문자는 비밀번호다. b) 어떻게 풀 수 있을까? 테스트 케이스를 하나의 배열에 담는다. 비밀번호를 기록하기 위한 배열을 하나 더 만든다. 비밀번호 배열의 길이가 0일 때, 테스트케이스 배열에서 방향키가 나오면 아무런 영향이 없다. 다음 .. 2021. 4. 8.
12. 인터럽트 동작방식 1. 시스템 콜 인터럽트의 작동과정 a) 시스템 콜 인터럽트 시스템 콜을 실행하기 위해서 강제로 코드에 인터럽트 명령을 넣어 CPU에게 실행을 시킨다 - 시스템 콜: 커널에서만 사용할 수 있는 OS 명령어 b) 실제 시스템 콜 코드 eax 레지스터에 시스템 콜 번호를 넣는다. ebx 레지스터에 시스템 콜에 해당하는 인자값(=매개변수)를 넣는다. 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨준다. mov eax, 1 //시스템 콜 번호 = 1 mov ebx, 0 //인자 = 0 int 0x80 //소프트웨어 인터럽트 명령어(= 인터럽트 함수가 담겨있는 주소를 찾기위한 값) c) 시스템 콜 코드를 받고 난 이후 과정 CPU는 사용자모드를 커널모드로 전환한다. IDT(Interrupt Descript.. 2021. 4. 8.