목록전체 글 (94)
혼자 정리
문제링크 C++ #include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int T, n; cin >> T; int arr[12]; arr[1] = 1; arr[2] = 2; arr[3] = 4; for (int i = 4; i > n; cout
문제링크 C++ #include using namespace std; int arr[50001]; void find(int N) { arr[0] = 0; arr[1] = 1; for (int i = 2; i arr[i - j * j] + 1: # print(i, j) arr[i] = arr[i - j * j] + 1 print(arr[N]) 모든 제곱수는 한 개의 제곱수로 나타내어질 수 있다는 것을 파악하는 것이 관건이었다. $O(N^{3/2})$의 시간 복잡도로 풀었다. ($N * \sqrt{N}$?) 파이썬에서 기존 c에서와 같은 for문은 안 되므로 굳이 그런 형태를 원한다면 while문을 써야 하려나? Python3에서는 시간초과, pypy3에서는 통과했다. pypy에서는 그만큼 메모리를 더 많이..
문제링크 CPP 코드 #include #include using namespace std; int M; int S; string cmd, num; void do_add(int &S) { cin >> num; S |= (1 > num; S &= ~(1 > num; if ((S & (1 0) cout num; if ((S & (1 0) { S &= ~(1 M; for (int i = 1; i > cmd; if (strcmp(cmd.c_str(), "add") == 0) do_add(S); else if (strcmp(cmd.c_str(), "remove") == 0) do_remove(S); else if (strcmp(cmd.c_str(), "check") == 0) do_check(S); else if ..
문제링크 #include #include #include using namespace std; int N, M; string temp; map maps; string arr[100001]; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for (int i = 0; i > temp; maps.insert(pair(temp, i + 1)); arr[i + 1] = temp; } for (int i = 0; i > temp; if (isdigit(temp[0])) { cout
문제링크 #include #include using namespace std; int count(int &i, int N, int M, string &S) { int idx = i + 1; int cnt = 0; while (idx = 0) return (cnt - N + 1); else return 0; } int find(int N, int M, string &S) { int i = 0; ..
Mutex lock mutex : mutual exclusion (상호 배제) 임계 영역 진입할 때 열쇠(lock) 가지고 들어가고, 나올 때는 열쇠 반납하는 느낌while (true) { acquire lock critical section release lock remainder section } acquire()와 release()의 두 함수 available의 불리안 변수. : lock을 얻을 수 있는 상황이면 true, 아니면 false. acquire() { while (!available) ; /* busy wait */ available = false; } release() { available = true; } acquire()와 release()과정도 atomically하게 이루어져야 ..
cf) 내용에 있는 오류로 발생하는 문제는 책임지지 않습니다. Data race 다음 코드 예시를 보자 #include #include int sum; void *run(void *param) { int i; for (i = 0; i < 10000; i++) sum++; pthread_exit(0); } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, run, NULL); pthread_create(&tid2, NULL, run, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); printf("%d\n", sum); }메인 함수에서 tid1과 tid2라는 스레드를 생성하였고 각각의 스레..
x86-64 CPU는 다음과 같이 64비트 값 저장 가능한 범용 레지스터를 16개 가지고 있다. 맨 앞의 붙은 r은 register의 의미로 64비트를 뜻한다 맨 앞에 e가 있는 경우 32비트를 의미 기본적으로 그림에서 보듯이 인스트럭션은 16개의 레지스터에 있는 여러 크기의 하위 바이트 데이터에 대해 연산할 수 있다. 64비트 연산시 레지스터 전체에, 32비트 연산시 하위 4바이트에, (위 그림에는 없지만) 16비트 연산시 하위 2바이트에, 8비트 연산시 하위 1바이트에 접근. 레지스터에서 1,2,4,8바이트를 사용할 수 있는데 8바이트를 사용하는 경우를 제외하고 전체 레지스터를 사용하지 않는다. 그러한 경우 레지스터의 남는 바이트들에 대해서 다음과 같이 처리한다. 1 or 2바이트 생성 : 나머지 바..
기본적으로 '워드(word)'는 16비트 데이터 타입을 지칭(처음에 16비트 구조를 사용하다 32비트로 확장했기 때문) 32비트는 '더블워드(double-word)' 64비트는 '쿼드워드(quad-word)' 아래 표는 C 기본 데이터 타입에 사용되는 x86-64 표현을 보여줌. 표준 int값은 더블워드로 저장(32비트=4바이트) 포인터는 64비트 머신에서 8바이트 쿼드워드로 저장. x86-64에서 long은 64비트(=8바이트)로 구현 C 선언 인텔 자료형 어셈블리코드 접미문자(suffix;꼬리 문자) 사이즈 (바이트) char Byte b 1 short Word w 2 int Double word l 4 long Quad word q 8 char * Quad..
p1.c와 p2.c의 C프로그램 작성한다고 가정. Unix 커맨드 라인에서 컴파일하려면 다음의 명령어 작성. linux> gcc -Og -o p p1.c p2.c gcc는 GCC C 컴파일러를 지칭. -Og옵션은 원본 코드의 전체 구조를 따르는 정도의 최적화를 하는 수준으로 기계어 코드를 생성한다. 더 높은 수준의 최적화 진행시 기존 C 코드의 전체적 구조를 변형시킬 가능성이 존재. 여기서는 학습을 위해 이 옵션을 사용할 것. GCC가 소스 코드를 실행 가능한 코드로 변환하는 과정은 다음과 같다. C _전처리기(preprocesor)_는 소스 코드 내의 #include나 #define 선언 같은 지시자들의 내용을 소스 코드에 삽입해준다. _컴파일러_가 각각의 소스 파일들의 어셈블리 코드 버전인 p1.s와..