분류 전체보기
[C] 문자열과 포인터
[C] 문자열과 포인터
2022.04.01지난번에 배웠듯 C에서 문자열을 표현할 때는 char타입의 배열을 사용해 마지막에 null (\0)문자를 붙이는 것으로 표현할 수 있다. 그런데 포인터 변수로도 배열을 표현할 수 있다면, 문자열도 포인터 변수로 표현할 수 있지 않을까? 표현할 수 있다. 하지만 첫 번째 방법과 두 번째 방법은 차이점이 있다. char * s1 = "your team"; 처럼 포인터 변수를 사용해 문자열을 표현하면, 문자열을 새로 할당하는 것도 가능하고, 문자열이 아니라 char의 주소를 할당하는 것도 가능하지만, 문자열의 일부분을 인덱스를 통해 변경하려고 하면 오류가 발생한다. 이는 자동 할당된 문자열에 대한 규칙으로 받아들여야 한다. char타입의 배열로 문자열을 선언하게 되면 아까와는 반대되는 상황이 발생한다. 배열 ..
[C] 포인터 연산
[C] 포인터 연산
2022.04.01포인터도 값이니 사칙연산이나 증감 연산자를 적용할 수 있지 않을까? #include #include int main() { int num = 1234; int *p = # printf("%p\n", p); printf("%p", p+1); } 포인터p의 값이 1000이라고 했을 때 p+1은 1001이 될까? 포인터 변수에 대해서도 덧셈과 뺄셈은 수행할 수 있지만, 정수 변수의 덧셈과는 다른 양상을 보인다. 변수의 타입에 따라 연산의 단위가 달라진다. 주소를 값으로 바꿔주는 * 연산자에 대해서 덧셈과 뺄셈을 수행해도 직관적인 결과를 얻을 수 있다. 배열과 같은 양상으로 연산을 수행한다. 당연하겠지만, *(ptr) +1을 출력하면 12가 출력되고, 배열 범위를 벗어나면 오류 대신 쓰레기값이 출력된다...
[C] 배열과 포인터
[C] 배열과 포인터
2022.04.01자바에서의 배열과 C에서의 배열은 성격이 좀 다르다. 일단, 배열을 선언한 변수 이름은 배열의 시작 주소를 의미하는 포인터이다. ( arr = &arr[0] ) 자바에서는 arr을 객체로 저장해 arr자체로는 뭐 할 수 있는게 많이 없지만, C에서는 그 자체로도 의미하는 바가 있다. 그러면, 변수명이 배열의 시작 주소를 의미한다고 했으니.. 특정 주소를 할당할 수도 있지 않을까? 라고 생각할 수도 있지만, 할당은 불가능하다. 포인터변수와 배열의 변수명은 굉장히 유사하지만, 배열의 변수명에다가 값을 새롭게 할당할 수는 없다. (읽기는 가능) int main() { int arr[3] = {0, 1, 2}; arr[0]++; printf("%d \n", *arr); // 1 printf("%d \n", ar..
버블 / 선택 / 삽입
버블 / 선택 / 삽입
2022.03.31버블 정렬 가장 기본적인 정렬 방법이다. 배열이나 리스트의 인덱스 0부터 시작해 오름차순으로 정렬을 수행한다. import java.util.*; public class BubbleSort { public ArrayList sort(ArrayList dataList) { for (int index = 0; index dataList.get(index2 + 1)) { Collect..
선 설계 후 코딩
선 설계 후 코딩
2022.03.31문제를 읽고 바로 키보드에 손이 가면 안된다. 특히 시간이 촉박한 상황에서, 급한 마음에 바로 키보드에 손을 올리게 되는 경우가 많은데 좋은 습관이 아니라고 생각한다. 1. 일단 문제를 천천히 읽으며 연습장에 간단한 케이스부터 고려해 어떻게 해결할 지 생각한다. 2. 해결 방법이 보이면, 문제를 여러 파트로 분리해 파트별로 풀이 로직을 메모한다. 3. 파트별로 사용할 변수와 알고리즘을 생각하고 메모한다. 알고리즘 문제를 풀 때는 항상 침착해야 한다.
시간복잡도와 공간복잡도
시간복잡도와 공간복잡도
2022.03.31시간 복잡도는 코드의 실행 시간을 의미하고, 공간복잡도는 코드가 메모리를 얼마나 잡아먹는지를 의미한다. 배열에서 특정 원소에 접근할 때는 인덱스를 기반으로 한 번에 찾아갈 수 있지만, LinkedList에서 특정 원소에 접근하려하면 처음이나 끝에서부터 시작해서 특정 원소의 위치까지 접근해야 한다. 이 때 배열은 원소의 접근에 있어서 시간복잡도가 낮고, 링크드리스트는 접근에 있어서 시간복잡도가 높다고 할 수 있다. C언어에서 int타입은 4바이트, char타입은 1바이트 등.. 변수를 선언하면 메모리에 주소값이 할당된다. 여기서 할당되는 메모리를 효율적으로 사용하면 공간복잡도가 낮다고 할 수 있다. 최근에는 대용량 시스템이 보편화돼서 공간복잡도보다는 시간복잡도를 향상시키는 쪽으로 기울고 있지만, 공간복잡도..
Java와 자료구조 - 배열
Java와 자료구조 - 배열
2022.03.29특정 타입의 데이터를 연속된 형태로 묶어놓은 자료구조로, 인덱스로 데이터에 접근할 수 있어 접근에 대한 시간복잡도가 매우 낮다. ( O(1) ) 배열을 선언할 때 메모리를 할당해야 한다. 간단하게 계산할 수 있다. (타입의 크기) * (배열의 크기) int[100][100]크기의 배열을 선언하면 4 * 100 * 100이 메모리에 할당된다. 정해진 타입의 데이터를, 입력 길이가 변하지 않을 때 배열을 사용하면 편하다. 구현이 간단하고 이해하기 쉬우며 앞에서 살펴봤듯 데이터에 접근하는 속도가 매우 빠르다는 장점이 있다.
[C] 포인터
[C] 포인터
2022.03.28포인터는 메모리 공간의 주소를 의미한다. 포인터만 따로 처리하는 타입으로 포인터 타입이 있다. ( * 로 표시하고, "%p"를 사용 ) 변수를 저장할 때 처음부터 포인터와 값을 함께 기록하면 좋지만, 저장할 때 메모리 공간이 따로 들어가고 매번 값을 확인해야 하기 때문에 잘 사용하지 않는다. 대신 크기별로 전담 변수를 둬 데이터의 타입으로 덩어리의 크기를 표현하는 방법을 사용한다. (int타입이면 int포인터, char타입이면 char포인터) int형 포인터 ptr1에 대해서 주소로 접근해 데이터를 읽을 때는 4byte를 한 덩어리로 보고 읽어온 값은 int형으로 처리한다. char형 포인터 ptr2에 대해서 주소로 접근해 데이터를 읽을 때는 1byte를 한 덩어리로 보고 읽어온 값은 char형으로 처리..
[C] 문자열
[C] 문자열
2022.03.28C에서는 boolean타입도 없지만 String타입도 없다. boolean대신 int타입을 대신해서 사용했고, String타입 대신 char타입의 배열로 String을 표현한다. char배열과 문자열의 구분은 문자열의 마지막에 '\0'의 유무로 판단한다. char배열의 끝에 모두 0으로 채우는 '\0'이 있으면 문자열로 인식하고, 그렇지 않으면 char배열로 인식한다. '\0'은 숫자로 해석 시 0이고, char로 해석 시 null로 해석하면 된다. char배열에서 '\0'을 만나면 뒤에 남아있는 요소에 상관없이 해석을 끝마친다. 즉, 널문자를 이용하면 문자열을 파싱할 수 있다. char str[10]; scanf("%s", str); printf("%s", str); scanf를 사용해 입력받을 때 문..
[C] 배열
[C] 배열
2022.03.28C에서는 자바와 배열의 선언 방식이 다르다. int arr[100]; 자바에서는 타입 뒤에 []가 와도 괜찮았지만, C에서는 변수명 뒤에 []를 붙여야 한다. 또, C에서는 객체지향 개념이 적용되지 않아서 저렇게 선언 후 바로 배열의 요소에 접근할 수 있다. int arr[100]; arr[1] = 12; 자바에서는 배열을 객체로 다루기 때문에 메모리 공간에 대해서 쉽게 이해할 수 있었다. 반면 C에서는 배열에 대해 생각해야 할 부분이 좀 있다. &는 주소를 의미한다고 보면 된다. rabbit[2] = 3; 같은 코드를 실행할 때, 배열의 시작인 rabbit[0]의 시작 부분(주소로는 100)에서 int사이즈의 크기인 4와 2를 곱한 값을 더해서 주소를 찾고, 값을 넣어준다. C에서 배열은 연속된 메모리..
Java와 자료구조 - Collection Framework 2
Java와 자료구조 - Collection Framework 2
2022.03.28Collection인터페이스를 구현하는 컬렉션들과 Map에 대해 이어서 살펴보자. HashSet Set인터페이스를 구현한 컬렉션이며, 역시 중복을 허용하지 않고 순서가 유지되지 않는다. 지정된 순서를 보장하지 않고 자체적인 저장방식에 의해 순서가 결정되기에, 순서가 중요한 경우는 LinkedHashSet 컬렉션을 사용하는 편이 합리적이다. 여기서 Hash는 해시 함수(Hash Function)를 이용해 데이터를 해시테이블에 저장하고 검색하는 기법을 의미한다. 해시를 통해 데이터가 저장된 위치를 빠르게 알 수 있어 많은 데이터 중 원하는 데이터를 빠르게 찾아올 수 있다. 해싱 기법에서 사용하는 자료구조는 배열과 링크드 리스트로 구성된다. 저장할 데이터의 키 값을 해시함수를 통해 배열의 한 요소를 얻고, 연..
Pytorch Lightning
Pytorch Lightning
2022.03.26Pytorch Lightning은 Pytorch보다 더 높은 수준의 추상화를 지원해 구조화된 코드를 작성할 수 있도록 한다. PL의 코드 스타일에 대해 살펴보자. 먼저 클래스(모델)를 선언한 다음, init함수에서 신경망 모델의 layer, 활성함수 등을 선언하고 forward에서는 이미 만든 layer를 활용해 모델을 구축한다. 그 다음 데이터를 준비한다. prepare_data함수에서 데이터를 입력받은 다음 텐서로 변환하고, 변환된 텐서에 대해 학습 / 검증 / 시험 단계를 거친다. 다음으로는 옵티마이저를 준비한 다음, 오차함수를 준비한다. 입력한 데이터를 최적화하는 과정이다. 즉, 학습 검증 평가 모드를 함수단위로 분할해서 진행한다. 각각의 단계를 자세히 살펴보자. epoch_end부분의 리턴타입은..