일단 씻고 나가자

23.04.06 본문

Study/닥치는 대로 주워 담기

23.04.06

일단 씻고 나가자 2023. 4. 7. 04:44

2023. 04. 06 목요일

 

- [DB] DATE의 차이를 구하는 방법? 둘 이상의 조건에 따라 다른 값을 출력하는 방법?

: TO_CHAR(컬럼 명, ‘YYYY-MM-DD’) 날짜, 를 이용한다.

SELECT 문에서 실행하며,

(CASE WHEN TO_NUMBER(날짜 날짜) => 조건

TEHN ~ ELSE ~ END) AS ~ 형태로 작성한다.

 

 

- 1부터 n까지의 각각의 모든 정수들의 약수 개수를 구하는 아이디어?

: n+1개의 정수 count 배열을 만든다. (0번 인덱스는 0 값이므로 무시하기 위해서)

이중 for문을 돌려, 각각 1의 배수, 2의 배수.. n의 배수까지 count 배열을 접근하여 해당 인덱스를 하나씩 늘려준다.

 

for(int I=1; i<=n; I++){

  for(int j=1; j<=n/i; j++)

    count[i * j]++;

}

 

 

- [Java] 정렬 기준이 여러 개일 때 구현하는 방법? sort와의 차이?

: sort는 정렬 기준이 단일 하나일 때,

comparablecomparator는 객체 간의 비교에서 쓰인다.

컬렉션의 sort는 비교할 값이 primitive가 아니라면

비교 객체에서 구현된 compare, compareTo 메서드로 객체의 순서를 구분한다.

둘 다 인터페이스이며, comareablecompareTo(o), comparatorcompare(o1, o2)를 구현해야 한다. (comparator는 현재 객체가 무엇이든 매개변수로 들어온 두 값만을 비교한다. comparablelang, comparatorutil에 있다.)

return 값이 각각 음수, 0, 양수라면 변화, 같음, 변화 없음의 기준이며

각각 오름차순, 0, 내림차순 순서로 변형된다.

클래스의 구현 -> class 클래스 명 implements comparable<클래스 명>{}

 

 

- [Java] Map을 정렬하는 방법?

: stream을 이용하여 key , value 별로 정렬할 수 있다. (key 별 정렬은 TreeMap을 이용)

map.entrySet().stream().sorted(Map.Entry.comparingByValue())

// 근데 이 방법은 toList()를 써야 한다. 조금 더 알아보자.

 

 

- [Java] Thread와 공유 객체의 개념?

: 여러 개의 Thread가 하나의 객체를 사용, , 여러 Thread가 하나의 객체를 가지고 있다는 의미.

그렇게 되면 순차 실행이 아닌 각자의 할 일을 같은 시간에 수행한다.

 

 

- [Java] 공유 객체에서 생길 수 있는 문제와 막는 방법?

: 각자 다른 할 일을 한다면 괜찮지만, Thread 들이 공유 데이터에 동시에 접근하여 문제가 생길 수 있는 상황이 있다. 따라서 공유 자원에 대한 접근과 수정이 이루어지는 메서드에 thread-safe 하도록 명령어를 설정해주면 된다.

 

그럴 땐 함수 반환 타입 앞단에 synchronized 명령어를 붙여주면, 해당 메서드를 가장 먼저 호출한 Thread가 해당 객체의 사용권을 얻게 되며 다른 Thread 들은 사용할 수 없게 된다.

(단 해당 명령어가 없는 메서드에 접근하는 Thread는 기다리지 않고 수행한다.)

이를 모니터링 락이라 한다.

해당 모니터링 락은 메서드 실행이 종료되거나, wait 메서드를 만나기 전까진 해제되지 않는다. 다른 Thread 들은 모니터링 락이 해제될 때까지 기다린다.

 

함수 전체를 synchronized 하는 것이 아닌 특정 블록만 걸 수도 있다.

synchronized(this) { ~ } 방식으로 함수 내부에서 작성한다. (임계영역 critical section)

 

 

- [Git] conflict가 일어났을 때 index의 변화?

링크 옆에 0이라 쓰여 있던 평소와 달리 숫자가 붙었다. conflict가 발생하면 숫자가 붙는다.

1에는 아예 아무 수정도 거치지 않았던 원본,

2에는 현재 branch의 내용,

3에는 병합하려는 branch의 내용이 저장되어 있다.

해당 conflict가 일어난 파일의 내용은 자동으로 경고를 담은 내용으로 바뀐다.

+) conflict를 자동으로 해결해주는 tool이 있다. (kdiff3 ) 나중에 필요할 때 써보자.

 

 

- 가산기란? 기본 구조의 논리?

: Accumulator. (CPU 내부에 존재) 전가산기를 활용하여, 실제로 어떻게 컴퓨터에서 연산이 되는지를 보여줌.

기존 가산기의 구조에 clear라는 입력을 추가해주어 input 되어 있는 곳에 0을 넣어주면 언제든 해당 데이터는 지워질 수 있다.

기본 논리는 가산기 -> 래치 -> 가산기의 구조로 되어 있다. 최초엔 래치에 저장된 값이 없으므로 output0과 가산기의 처음 들어오는 input 데이터의 연산은 당연히 input 값이다.

그 후 래치에 저장되면, 그제야 래치는 한 바퀴를 돌아 다시 가산기에 첫 input 값을 전달해주고 그 이후 실제 연산하고자 하는 값과의 연산이 가산기에 input으로 들어오게 된다.

새로운 연산이 들어오면 clear를 통해 래치를 비워준다. (축적이므로 accumulator의 의미)

 

 

- 가산기의 구조를 통한 레지스터와 캐시 의미?

: 가산기의 구조에 의해, 기본적으로 첫 input을 받아 저장해놓을 수 있는 공간이 필요하다.

그것을 레지스터라 부른다. (임시적인 공간) 보통 하나의 데이터만 임시적으로 저장하는 공간이기 때문에, 3264든 하나만 저장할 수 있는 공간이 여러 개가 있는 경우가 많다.

해당 그림은 왼쪽 저장공간에 접근하는 데 필요한 클럭 수를 말한다.

메모리까지 가는 데는 많은 사이클이 필요하므로, 만약 매번 메모리에 접근한다면 피 연산 데이터가 올 때까지 CPU는 클럭만 튕길 뿐 아무런 작업을 하지 못할 것이다.

따라서 보통 데이터를 받으면 바로 하위 메모리에 바로 저장해놓고 필요할 때마다 쓰는 것이다.

 

 

- 이진 탐색이란? 알고리즘 논리?

: Binary Search. 기본적으로 정렬된 데이터에서 특정 값을 빠르게 탐색하는 방법.

절반씩 비교해서 작으면 왼쪽, 크면 오른쪽으로 가서 찾음.

 

while문을 돌며 투 포인터로 left, right와 가운데 값인 mid를 놓고,

값이 해당 위치보다 작으면 right = mid 1; 크면 left = mid + 1; 해준다.

 

+) Java에서는 배열에서 특정 값을 찾는 것에 대하여 Arrays.binarySearch(arr, key) 함수를 제공해준다. 해당 메서드는 값을 찾으면 해당 인덱스를 리턴해주며, 배열에 해당 key가 없다면 해당 값이 있을 -(인덱스 +1) 값을 보여준다.

 

 

- 분할정복에서 투 포인터의 가운데 mid 값을 오버플로우 안 나게 하는 방법?

: int mid = left + (right left) /2; // if(left==right) return;

 

 

- 다이나믹 프로그래밍과 분할정복의 차이? 다이나믹 프로그래밍의 종류?

: 각기 다른 부분을 분할정복할 때, 앞으로의 계산에서 다른 부분의 값을 재활용할 수 있다면 그 값을 저장하여 사용하는 방식. (ex. 피보나치)

 

타뷸레이션(Tabulation) - 바텀 업 방식 // 차근차근 계산 단일 for

메모이제이션(Memoization) - 탑 다운 방식 // 계산이 필요한 시점에서만 계산 - 재귀

두 가지로 나뉜다.

'Study > 닥치는 대로 주워 담기' 카테고리의 다른 글

23.04.10  (1) 2023.04.11
23.04.07  (0) 2023.04.08
23.04.05  (0) 2023.04.06
23.04.03  (0) 2023.04.04
23.03.31  (0) 2023.04.01