IT취업 53

[ Coding Style Guide ] 00. 코딩 명명법

--오랜만의 포스팅이다.. 회사 프로젝트로 바빠 업로드 하지 못한 나 자신을 반성합니다-- 프로젝트를 진행하면서 선언하는 변수명,함수명,클래스명 등 여러가지 이름들의 명명법에는 규칙이있다. 대표적으로 카멜표기법, 파스칼표기법, 스네이크 표기법이 있는데 하나씩 알아보겠다. 카멜(Camel) 표기법 int manAge; int womanAge; int peopleAge(int man, int woman) { return man + woman; } 변수명과 함수명을 카멜표기법으로 작성한 예이다. 카멜표기법은 낙타등처럼 내려갔다 올라가는 모양인데 woman+age 처럼 단어 여러개가 붙을때 맨 앞에오는 단어만 소문자로 표기하고, 뒤에오는 단어는 대문자로 표기하는 방법이다. (세단어 이상일경우도 맨앞만 소문자) ..

[ Programmers ][JAVA][60063] 블록 이동하기

프로그래머스 2020 KAKAO BLIND RECRUITMENT 블록 이동하기 :https://programmers.co.kr/learn/courses/30/lessons/60063 코딩테스트 연습 - 블록 이동하기 [[0, 0, 0, 1, 1],[0, 0, 0, 1, 0],[0, 1, 0, 1, 1],[1, 1, 0, 0, 1],[0, 0, 0, 0, 0]] 7 programmers.co.kr 대표적인 BFS 구현문제 인줄 알고 쉽게 덤벼들었지만, 고려해야 할 게 많아 꽤 까다로웠다. 처음 생각은 bfs로 회전과 직선이동을 나누고 동서남북대각선 체크해주면서 벽이 아닌 곳의 최대좌표를 리턴해주며 최소시간을 구하는 것이었다. 하지만 테스트케이스를 충족하지 못하였고, 다른 블로그를 참고해서 답을 고쳤다. (..

[ Nandflash ] 00. 낸드플래시의 기초, MOSFET

Nandflash Nandflash datsheet와 Nandflash driver source code를 기반으로 낸드플래시를 이해해보자 NAND flash = MOSFET + FG(floating gate) 본격적으로 낸드플래시를 설명하기 전에 DRAM과 플레시메모리(Flash Memory)의 차이에 관해 설명하겠다. 저장방식에 있어서 DRAM은 캐패시터에 저장하는 반면 플레시메모리는 플로팅게이트(Floating Gate:FG)라는 곳에 데이터를 저장한다. 따라서 DRAM은 휘발성, 플래시메모리는 비휘발성의 특징을 가지게 된다. MOSFET Metal - Oxide Semiconductor Field-Effect Transistor 금속-산화 반도체 전계 효과 트랜지스터 Basic NMOS의 구조와 ..

[ C ] 16. volatile 이용하기

[ volatile ] 변수를 선언할 때 앞에 volatile을 붙이면 컴파일러는 해당 변수를 최적화해서 제외하여 항상 메모리에 접근하도록 만든다. volatile int num1 = 10; // 변수를 최적화해서 항상 메모리에 접근하도록 만듦 volatile로 선언한 변수는 사용할 때 항상 메모리에 접근한다. 즉, 이 변수는 언제든지 값이 바뀔 수 있으니까 항상 메모리에 접근하라고 컴파일러에게 알려주는 것이다. 예를 들면 다음과 같은 반복문이 있다. int i = 0; while(i 컴파일러는 이 코드를 최적화하여 while 반복문을 없애버리고 i에 그냥 10을 할당해 버린다.(Visual Studio의 /02옵션, GCC의 -03옵..

[ Linux Kernel ] 15. Kernel Preemption

19. Kernel Preemption 19.1 Mutual Exclusion — 상호 배제 컴퓨터 시스템을 얘기할 때 가장 중요한 파트 중 하나가 상호 배제 문제이다. 시스템이 정상적으로 작동하기 위해서는 이 상호 배제 개념은 반드시 필요하다. 설명을 진행하기 전, 먼저 X++이라는 연산이 정확하게 어떻게 이루어져 있는지부터 이해하고 가자. 우리가 보통 프로그래밍 언어를 사용할 때 X++과 같은 단항연산자를 사용하면, 하나의 명령만으로 덧셈이 정상적으로 이루어지는 것 같지만 실제로 동작하는 기계 입장에서 이 단항연산 과정은 3단계로 나누어진다. 그 과정은 아래와 같다. X를 저장소로부터 읽어서 CPU 레지스터로 읽어들인다. CPU 안에서 ALU 연산을 진행한다. CPU 로부터 나온 결과를 다시 저장소에..

[ Linux Kernel ] 14. Kernel Scheduling(커널 스케쥴링)

18. Kernel Scheduling (커널 스케쥴링) 리눅스에서는 어떤 프로세스가 다음에 실행될 프로세스일까? 물론 priority(우선순위)가 가장 큰 프로세스가 실행될 것이다. 하지만 time slice를 가지고 있는지도 반드시 확인해야 한다. 타임 슬라이스(time slice)에 대한 설명은 아래 그림을 보면서 살펴보도록 한다. 먼저 위쪽 네모박스 안의 내용을 살펴보자. CPU가 어떤 프로세스에게 할당될 때는 일종의 시간제한이 있게 된다. 위 예시에서는 100ms라고 되어 있다. 하지만 안타깝게도 이마저도 못쓰게 되는 경우가 발생할 수 있다. 현재 프로세스보다도 더 급한 작업이 요구되었을 때, CPU를 또다시 빼앗길 수 있다. 위 네모박스 안에서는 20ms를 사용하다가 CPU를 뺏겨버렸고 남은 ..

[ Linux Kernel ] 09. 중간정리 및 Daemon(데몬)/Server(서버)

12. 총정리 지금까지 다뤘던 내용들을 총 엮어서 설명을 진행한다. 꽤나 복잡한 그림이 엮여 나오니 설명과 함께 따라오도록 노력해보자. 일단 아래 그림에 분홍색 구간은 커널이다. 커널 안에는 여러가지 시스템 콜이 존재하고 있다. 그리고 이 시스템 콜들은 context_switch()와 같은 내부함수와 연관이 있으며 각 하드웨어 자원마다 자료구조가 존재(struct CPU)한다. 아래 그림 또한 그림에 오류가 있는 부분이 있는데, 오류가 난 부분은 설명하면서 함께 나오니 너무 걱정할 필요는 없다. fork()를 진행하면 커널로 진입한다. 커널에서 fork( )는 부모 프로세스와 똑같은 image를 생성한다. 점선으로 표시된 이유는 아직 CPU 제어가 부모 프로세스에 있기 때문에 자식 프로세스로 향하는 선은..

[ Linux Kernel ] 08. Context Switch

11. Context Switch (유저 모드와 커널 모드 사이의 전환) 지금부터 설명하는 내용은, 설명과 함께 그림을 봐야 이해가 잘되니 이 점 꼭 유의해서 설명을 차근차근 살펴보자. 유저가 쉘이 띄어 준 프롬프트에 명령어(“ls”)를 입력한다. 쉘 입장에서 이 프로세스를 실행시키기 위해서 fork( )를 실행한다. 여기서 쉘은 부모 프로세스가 되고 새롭게 생기는 프로세스는 자식 프로세스가 된다. fork()가 동작하면서 쉘의 PCB와 쉘의 a.out(코드)을 그대로 복사한다. 그러나 CPU는 아직 쉘에게 할당되어 있기 때문에 ls가 실행되거나 하진 않는다. 부모 프로세스 쉘이 wait( )을 호출하게 되고 쉘은 잠들게 된다. 잠들면서 부모 프로세스는 CPU의 대기 리스트(queue)에 들어가게 된다...

[ 기타 ] 02. 마크다운(markdwon) 문법 알아보자

git을 활용하고 개발하는 사람들이라면 마크다운 다들 많이 이용하실텐데요~ 오늘은 마크다운 작성법과 문법에 대해서 알아보겠습니다~ 저는 typora를 사용 하고 있어요 마크다운 기초 1. 제목(Heading) 제목은 # 으로 표시된다. 제목 레벨은 6단계 까지 있다. h3 제목 h4 제목 h5 제목 h6제목 2.목록 순서가 있는 목록 순서가 있는 목록 enter+tab을 통해 레벨 다운 순서가 없는 목록 순서가 없는 목록 여기에서 shift + tab 여기에서 엔터 여기 여기 결국여기. 3.링크 마크다운 설명서 4.이미지 typora의 가장 큰장점ㅎ(이미지를 그냥 올리면 ㅇㅋ) typora에서 이미지를 편하게 활용하기 위해서는 추가 설정이 필요하다. 아래의 옵션을 모두 체크 로컬 이미지에 해당 규칙 온라..

IT/[ 기타 ] 2020.08.14

[ 기타 ] 01. 제안서 작성하기

제안서 작성하기 제안 개요 제안 배경 제안 목적 수행 방안 구성 아키텍처 개발 방안 데모 화면(예) 수행 일정 기타 RFP에 기재된 기능 하나하나를 어떻게 개발할 것인지를 세부적으로 명시. 자유양식 모듈별로 세분화하여 일정을 세운 뒤 전체 일정을 수립 배경 : 다른 경쟁 업체들을 조사하기. U+(홈네트워크), 현대기아(커넥티드카) => 우리는 이렇게 더 발전할 것이다. 유의 사항 쉽게 작성한다. (Simple is Best) - 전문용어를 최소화 전체 목차 구조를 의식. 프레임읆 맞출 것 RFP 요구사항은 모두 기술 요구사항이 누락된다면 심사과정에서 큰 불이익을 받는다. 차별화 포인트가 있다면 적극 표현. 주의!!! 동문서답은 NO~

IT/[ 기타 ] 2020.08.14

[ 개념 ] 04. Locality 관점에서 Quick Sort가 Merge Sort보다 빠른 이유

> Locality의 관점에서 Quick sort가 Merge sort보다 빠른이유 Quick sort와 Merge sort는 nlogn의 시간복잡도를 가지는 대표적인 정렬 방법이다. 일반적으로 Quick sort가 Merge sort보다 크다. 그 이유는 Locality와 관련이 있다. Locality의 개념을 알아보고 왜 Quick sort가 더 빠른지 알아보도록 하자. Locality 지역성(Locality)은 CPU가 짧은 시간 범위 내에 일정 구간의 메모리 영역을 반복적으로 엑세스하는 경향을 말한다. 메모리 내의 정보를 균일하게 엑세스 하는게 아닌, 짧은 시간내에 특정 부분을 집중적으로 참조하는 특성이다. void f() { //간단한 작업을 수행 } void g() { int arr[1000]..

[ 개념 ] 02. 이진트리에 관하여

> 이진트리 1. 후위 순회(postorder) 이진 트리(binary tree)의 후위 순회 알고리즘이 사용될 수 있는 대표적인 예는 특정 디렉토리(directory)의 용량 계산이다. 단, 이진 트리이기 때문에 특정 디렉토리(=폴더)의 서브 디렉토리의 개수는 2개 이하로만 존재해야 한다. 삼진 트리(ternary tree)였다면 서브 디렉토리는 총 3개까지 존재할 수 있다. 1.1 디렉토리의 용량 계산 디렉토리의 용량 계산을 위해서는 어떤 알고리즘이 사용되야하는가를 먼저 고민해보자. 생각을 할 때 구체적인 상황을 두고 예시를 들어보면 이해가 빠르다. 현재 사용하는 컴퓨터에 datastructure 라는 디렉토리가 있다고 가정해보자. 이 datastructure 디렉토리 내부에는 stack, queue..

[ 개념 ] 01. N-gram과 두 점 사이의 거리 구하기

> N-gram 빅데이터 분석, 검색 엔진에서 많이 쓰인다. 구글은 책들을 스캔해서 N-gram viewer를 만들었는데 사람들의 언어 패턴을 시대별로 분석하기도 함. N-gram은 문자열에서 N개의 연속된 요소를 추출하는 방법. 만약 "hello"라는 문자열을 2-gram으로 추출하면 He, el, ll, lo 글자 단위 N-gram( 2gram ) #include #include int main(){ char text[30] = "Hello"; int length; length = strlen(text); for (int i=0; i

[ 개념 ] 00. 회문판별

> 회문판별 회문은 유전자 염기서열 분석에서 많이 쓰인다 회문(palindrome)은 순서를 거꾸로 읽어도 제대로 읽은 것과 같은 단어와 문장을 말한다. #define _CRT_SECURE_NO_WARNINGS #include #include #include int main(){ char word[30]; // 단어 저장 배열 int length; // 문자열 길이 bool isPalindrome = true; // 회문 판별값을 저장할 변수, 초깃값 TRUE printf("단어 입력하세요: "); scanf("%s", word); length = strlen(word); // 0부터 문자열 길이의 절반만큼 반복 for(int i=0; i

[ C ] 14. goto에 관하여

[ goto에 관해 ] goto는 별다른 제약 조건 없이 원하는 부분으로 이동할 수 있기 때문에 초보 때는 goto를 남발하는 경우가 많다. 그러다 보니 처음에는 goto는 가급적 사용하지 말라고 한다. 하지만 goto를 적절히 활용하면 중복되는 코드를 없애고 코드를 좀 더 간결히 만들 수 있을 것이다. 특히 에러처리에 매우 유용하기 때문에 리눅스커널에서도 자주 쓰이며 for, switch 등 중첩 반복문에 많이 쓰이는 것을 알아두자. # 스파게티 코드 스파게티 코드는 `goto`를 과도하게 사용해서 프로그램의 흐름이 마치 스파게티 면발처럼 꼬여있다는데서 붙여진 이름이다. 그래서 스파게티 코드는 가독성이 떨어지고 유지보수가 매우 힘들다. goto와 레이블 #define _CRT_SECURE_NO_WARN..