일단 씻고 나가자
23.04.21 본문
2023. 04. 21 금요일
- [DB] A 테이블의 A` 컬럼의 MAX 값에 대하여, A의 모든 애트리뷰트를 출력하는 방법?
: 서브 쿼리를 이용해야 한다.
SELECT *
FROM A
WHERE A` = (SELECT MAX(A`) FROM A);
주의할 점은 WHERE 절에 = 형태로 서브 쿼리를 작성해야 한다는 것이고,
서브 쿼리 내부에서는 ; 로 끝맺지 않다는 점이다.
- [Git] pull 사용 시 주의점? 분산 버전 관리 시스템이란?
: 두 저장소를 연결했을 땐 사용 이전에 pull을 하여 로컬, 원격 저장소의 내용을 합치고 충돌되는 부분을 로컬에서 해결한 후 작업을 해야 한다. 즉, push 이전에 무조건 pull로 바뀐 내용을 받아온 후 작업을 해야 한다.
각 로컬 저장소가 하나의 버전을 만들어서 원격 저장소와 동기화를 시키는 시스템.
분산 버전 관리 시스템이라 하여도 잦은 push로 함께 작업하는 개발자들에게 수정한 내용이 반영된 코드를 제공할 수 있도록 해야 함.
- 프로세스 간의 접근법은 무엇이며, 종류? 해당 종류들의 공통 특징?
: IPC(Inter Process Communication)
성능을 높이기 위한 멀티 프로세스 환경에서 중요하다. 병렬적으로 어떤 작업을 수행할 때,
작업의 결과를 공유하기 위해선 필수가 되기 때문이다.
리눅스는 프로세스마다 4GB의 공간을 할당해주는데, 모든 프로세스는 가상 메모리로 매핑되어 있으므로 4GB의 주소가 모두 같다. 이때 3GB ~ 4GB의 주소는 커널에게 할당하여(실제로 커널이 들어가 있는 것이 아닌, 해당 주소에 접근하면 커널의 공간으로 들어갈 수 있게끔 가상 메모리 주소를 설정한 것) 해당 주소를 통해 소통할 수 있다.
1. 파일로 작성 // 모든 프로세스가 접근할 수 있는 파일을 하나 작성하여 그곳에 결과를 적으면 되겠지만, 특정 프로세스가 파일에 입력 후 다른 프로세스에게 작업을 완료했다고 알려줄 방법이 없다.
2. 시그널 // OS가 특정 프로세스에게 noti를 주는 방식인데, 이는 특정 프로세스가 다른 프로세스에게 알림을 주는 방법으로도 사용된다. IPC 기법으로 사용할 수 있는 함수.
3. 세마포어 // 동기화 기법을 위해 사용되는 기능이지만, IPC에도 사용 가능.
4. 소켓 // 통신을 위한 기능이지만, 프로세스 간 통신으로도 사용 가능.
주요 기법은 Message Queue, Shared Memory, PIPE 세 가지이며, 파일 외에 모든 기법은 모두 커널 공간을 사용하는 것이다. (커널 내의 특별한 메모리 공간)
- O(n)의 정렬법 3가지 종류와 설명?
1. 기수 정렬(Radix Sort) O(최대 자릿수 n)
// 낮은 자릿수부터 정렬하는 방식. 각 원소 간의 비교가 아닌, 기수 테이블 (메모리 소요) 이용으로 속도가 빠름.
자릿수가 원소의 개수보다 커지면 속도가 자릿수만큼 증가한다.
구현 방법으로는 두 자릿수라고 가정했을 때, 끝자리 0~9까지 공간을 만들고 끝자리에 맞는 위치에 각 원소를 배치한다. (Queue) 이후 두 번째 자릿수에 맞게 공간을 재배치하여 나열한다.
2. 계수 정렬(Counting Sort) O(원소 중 최댓값 + n)
// 비교가 아닌 카운트를 세서 정렬하는 방식. 역시 공간이 필요하다.
간단하게 원소 중 가장 큰 값의 공간만큼 배열을 준비하여, 원소의 값을 index로 보고
해당 index의 배열에 +1씩 하는 것.
이후 배열을 다 돌며 확인해야 한다.
3. 셸 정렬(Shell Sort) O(n^2)
// 삽입 정렬의 약점을 보완한 방식. 삽입 정렬에선 앞쪽의 모든 데이터와 비교 연산해야 하는데, 셸 정렬은 모든 데이터를 비교하지 않고 일정 간격을 두어 비교한다. (몇 칸씩 뛰어서)
간격의 값에 따라 worst case는 같으나, 일반적인 산포 데이터의 기준으로는 더 빠르다.
일반적으로 간격 설정은 배열의 길이/2만큼 잡는다.
구현은 자리마다 배열의 전체 길이/2만큼의 앞 데이터와 비교하여, 연산 결과에 따라 서로 위치를 바꾼다.
이후 계속 연산하며 이땐 배열의 전체 길이/2/2처럼 2씩 나누어 가며 비교한다.
- 안정성이란? (안정 정렬)
: stability. 같은 값의 데이터에 대해서는 원래의 순서를 지키는지에 대한 보장.
예를 들어 객체들의 sort에서 특정 객체의 age라는 값으로 정렬한다고 했을 때
A(5), B(4), C(4) 이라면 B-C A의 순서로 정렬을 보장하는 성질이다.
대표적으로 bubble은 안정성이 있으며, 선택은 안정성이 없다.
- [Java] 임의의 숫자의 자릿수를 구하는 간편한 방법?
: 일반적으로는 while 문을 돌며 해당 숫자를 지속해서 10을 나누며 count를 하는 방법이 있지만, 같은 논리로 Math의 log10 함수를 쓰면 간단하다. 단, 나온 값을 int로 감싸주고 결과에 1을 더해주어야 원하는 값이 나온다.
n == 101 // (int)Math.log10(101) +1; --> 2 +1 --> 3자리.