deck:: Logseq/coding tip

- ## **❖ Javascript / Typescript**
	- ### **► 이차원 배열(n*m) 생성**
		- id:: 6867f897-928a-4f22-8184-491fa70314db
		  1. Array.from() 사용법
			- ```javascript
			  const arr = Array.from({length : n}, () => new Array(m).fill(0));
			  ```
		- id:: 6867f8fc-3249-4ced-91aa-a2c951c11b0b
		  2. Array().fill() 사용법
			- ```javascript
			  const arr = new Array(n).fill().map(() => new Array(m).fill(0));
			  ```
		- id:: 6867f8fe-39c6-438b-a045-4f8687ad0b1d
		  3. 반복문 순회
			- ```javascript
			  let arr = [];
			  for(int i=0; i<n; i++){
			    arr[i] = [];
			    for(int j=0; j<m; j++){
			      arr[i][j] = 0;
			    }
			  }
			  ```
	- ### **► 배열 매서드**
		- ### **◼︎ Array.every((element, index, array) => {조건식})**
		  id:: 686922a8-1c72-4261-8339-aff6ece36f03
			- **배열의 모든 요소가 조건식을 만족하는지 확인해서 true/false를 반환하는 매서드**
			- **elememt : 현재 요소, index : 현재 인덱스(생략가능), array : 원본 배열(생략 가능)**
			- **배열의 모든 요소가 특정 값인지 혹은 특정 범위에 있는지 확인하는 용도로 사용가능**
			- ```javascript
			  const arr = [1,2,3,4,5,6,7,8,9,10];
			  
			  arr.every((v,i) => v===i+1); // true
			  arr.every((v,i,array) => {
			    if(i<[array.length-1]){
			      return array[i] < array[i+1];
			    }
			    else {
			      return true;
			    }
			  }); // true
			  arr.every(v => v===arr[0]); // false
			  ```
		- ### **◼︎ Array.slice(start_idx, end_idx)**
		  id:: 68692600-551c-488b-ad74-de8145729133
			- **배열에서 특정 범위의 인덱스 부분만 잘라내서 그 배열을 반환하는 매서드**
			- **end_idx는 생략 가능하다**
				- 이 경우에는 start_idx 부터 끝까지 반환한다.
			- **배열의 start_idx 인덱스 부터 end_idx - 1 인덱스까지의 배열을 잘라내서 반환홤**
				- 예를 들면 arr.slice(2,7) 은 arr의 인덱스2 부터 인덱스 6까지의 배열을 반환함.
			- **범위를 초과해도 에러를 내지 않음. 그저 빈 배열을 반환할 뿐임.**
			- **아무리 호출해도 원본 배열 자체를 바꾸지는 않는다.**
			- ```javascript
			  const arr = [0,1,2,3,4,5,6,7,8,9,10];
			  
			  const arr1 = arr.slice(2); // [2,3,4,5,6,7,8,9,10]
			  const arr2 = arr.slice(5,10); // [5,6,7,8,9]
			  const arr3 = arr.slice(12); // []
			  ```
		- ### **◼︎ Array.forEach((element, index, array) => {})**
		  id:: 6869280c-f685-44c4-b73e-a33f351be582
			- **배열의 모든 요소를 순서대로 순회하면서 코드를 실행하는 매서드**
			- **element(현재 요소)는 반드시 필요하고, index(현재 인덱스)와 array(원본 배열)는 생략 가능하다.**
			- **모든 배열을 순회하는 반복문과 비슷하게 사용이 가능하다**
				- 단 반복문에서 쓰이는 continue나 break는 사용할 수 없다.
				- return을 continue 처럼 사용할 수 있고, break는 사용할 수 없다.
				- 즉 break가 꼭 필요하다면 반복문으로 구현한다.
			- ```javascript
			  const arr = [1,2,3,4,5];
			  arr.forEach(v => {
			  if(v===3) return;
			  console.log(v);
			  });
			  // 1 2 4 5
			  ```
		- ### **◼︎ Array.reduce((acc, element, index) => {콜백함수}, initial value)**
		  id:: 6869298b-18fd-4524-a697-c1af9e510c34
			- **배열의 각 요소별로 순회하며 누적자(acc)를 계산하고 모든 순회를 마친 뒤의 누적자를 반환하는 매서드**
			- **초기값을 입력하지 않으면 기본적으로 acc는 0으로 초기화 된 채 실행된다.**
			- **코드가 한줄이면 굳이 return으로 반환을 할 필요는 없으나 계산코드가 2줄 이상이면 누적값을 직접 return 해주어야 한다.**
			- ```javascript
			  const arr = [1,2,3,4,5];
			  const sum = arr.reduce((acc,v) => acc + v, 0); // 15
			  const sum_odd = arr.reduce((acc,v) => {
			    if(v%2===0) return acc;
			    else return acc+v;
			  },0); //9
			  ```
		- ### **◼︎ Array.sort((a,b)=>{콜백함수})**
		  id:: 686a6dfd-328e-4dd0-bd8a-abbef2ae13ee
			- **배열을 정렬하는 매서드이고 기본적으로 파라미터를 입력하지 않으면 오름차순으로 정렬한다.**
			- **반환값은 없고 원본 배열 자체를 변경한다.**
			- **이 정렬 알고리즘은 배열의 데이터를 무조건 문자형으로 보고 정렬(사전순)하기 때문에 숫자를 정렬할 때는 이상하게 정렬이 될 수도 있다.**
				- [10,2,5,9,8,7] 을 오름차순 정렬하면 [2,5,7,8,9,10] 이 되어야 하지만 이걸 문자로 보고 정렬하기 때문에 실제로는 [10,2,5,7,8,9] 로 정렬된다.
			- **숫자에 대해서 제대로 정렬하기 위해서는 콜백함수를 넣어줘야 한다.**
				- a와 b는 각각 인덱스 기준으로 보면 a가 b보다 앞선 인덱스에 있는 두 요소들을 의미한다.
					- 이 두 요소 사이의 인덱스 간격은 신경쓰지 않는다. 그저 a가 앞에 있다는 것만 기억하자.
				- 이때 이 a와 b의 관계식을 통해 콜백함수의 반환값을 설정해서 이 관계식이 모든 정렬이 끝난 뒤에 이 반환값이 모두 false가 되면 정렬이 완료된 것으로 취급한다.
			- **예시**
				- ```javascript
				  const arr = [5,9,7,4,3,2,8];
				  arr.sort((a,b)=>a-b); //[2,3,4,5,7,8,9] 오름차순
				  // 이전 인덱스 요소와 다음 인덱스 요소의 차이가 모두 양수가 아니게 되도록 정렬한다
				  arr.sort((a-b)=>b-a); //[9,8,7,5,4,3,2] 내림차순
				  // 이전 인덱스 요소와 다음 인덱스 요소의 차이가 모두 음수가 아니게 되도록 정렬한다
				  ```
	- ### **► Object 자료형**
		- ### **◼︎ 정의 및 선언 및 접근방법**
		  id:: 6874a753-d361-4df8-8dd5-15bb865ac8df
			- 키(key)와 값(value)을 가지는 데이터의 집합
			- 자체적으로는 iterable하지 않음(반복가능한 자료형이 아님)
				- 따라서 for문에서 순회할 때 for ... in Object.keys(), Object.values(), Object.entries() 와 같은 방법으로 순회해야함
			- 키는 무조건 문자열과 심볼만 가능함.
			- 키의 삽입 순서가 보장되지 않음.
			- ```javascript
			  // 빈데이터 초기화 방법
			  let obj = {};
			  
			  // 직접 선언 방법
			  let obj = {
			  	"name":  "Yechan",
			  	"age" : 30
			  };
			  
			  // 출력
			  console.log(obj.name);
			  console.log(obj["age"]);
			  // Yechan
			  // 30
			  // 두 방법 모두 사용 가능
			  ```
		- ### **◼︎ 키 및 값 순회**
			- **for ... in**
			  id:: 6874a966-4831-47ed-b969-a7d6d6269a9b
				- 기본적으로 Object의 키값을 순회함.
				- ```javascript
				  let obj = {
				  	"name":  "Yechan",
				  	"age" : 30
				  };
				  
				  for(let key in obj){
				  	console.log(obj[key]);
				  }
				  ```
			- **for ... of**
			  id:: 6874a9fd-e3da-475b-95d8-06889eb8ce56
				- 각 객체의 매서드를 통해 키, 값, 혹은 둘 다를 직접 가져와서 순회해야함.
				- ```javascript
				  let obj = {
				  	"name":  "Yechan",
				  	"age" : 30
				  };
				  
				  for key of Object.keys(obj) {
				  	console.log(key, obj[key]);
				  }
				  // name Yechan
				  // age 30
				  
				  // key, value 순회
				  for [key, value] of Object.entries(obj) {
				  	console.log(key, value);
				  }
				  // name Yechan
				  // age 30	
				  ```
	- ### **► 반복가능 객체에서의 순회**
		- ### **◼︎ 일반적인 방법(for문)**
		  id:: 6874a69f-d252-4666-813b-17e1e2b50101
			- for문에서 of로 하나씩 순회함
			- ```javascript
			  const num = [1,2,3,4,5];
			  for(let n of num) {
			    console.log(n);
			  }
			  // 1 2 3 4 5
			  ```
- ## **❖ Python**
	- ### **► 이차원 배열(n*m) 생성**
	  id:: 6867f994-13d0-4937-90e9-d8aec7be5d67
		- ```python
		  arr = [[0]*m for _ in range(n)]
		  ```
	- ### **► 배열 관련 매서드**
		- ### **◼︎ arr.count(value)**
		  id:: 686a721d-df2e-4662-a6dd-c235cce8c5ac
			- 리스트, 혹은 문자열에서 특정 값의 개수를 반환하는 매서드
			- ```python
			  string = "aaabbcccc"
			  print(string.count('a')) # 3
			  print(string.count('b')) # 2
			  print(string.count('c')) # 4
			  
			  arr = [1,2,2,3,3,3,4,4,4,4]
			  print(arr.count(1)) # 1
			  print(arr.count(2)) # 2
			  print(arr.count(3)) # 3
			  print(arr.count(4)) # 4
			  ```
		- ### **◼︎ arr.sort()**
		  id:: 686a726b-38e3-4adc-836a-2d0856046e73
			- 원본 배열 자체를 정렬하는 매서드.
			- 기본값은 오름차순이고 파라미터에 reverse=True 를 하면 내림차순으로 정렬됨.
			- 문자열에도 정렬이 가능함.
				- 단 문자열이 문자들로 이뤄진 리스트로 바뀌게 됨으로 다시 문자열로 바꾸기 위해서는 join을 이용해서 합쳐줘야함.
			- ```python
			  arr = [5,8,2,4,9]
			  arr.sort() # 2 4 5 8 9
			  arr.sort(reverse=True) # 9 8 5 4 2
			  ```
		- ### **◼︎ sorted(arr)**
		  id:: 686a732c-734e-417c-b7e2-f3bfb8caa71b
			- 변수로 들어온 배열을 정렬한 뒤 그 결과를 반환하는 매서드, 즉 반환값이 배열임.
			- 기본값은 오름차순이고 파라미터에 reverse=True 를 하면 내림차순으로 정렬됨.
			  id:: 686a734e-b423-486f-8ec7-e5491e310fe0
			- ```python
			  arr = [5,8,2,4,9]
			  arr1 = sorted(arr)
			  arr2 = sorted(arr, reverse=True)
			  print(arr1) :-> # 2 4 5 8 9
			  print(arr2) # 9 8 5 4 2
			  ```
- ## **❖ C**
- ## **❖ Java**
- ## **❖ 프로그래밍 관련 이론 정리**
	- ### **► 알고리즘**
		- ### **◼︎ 진수변환 알고리즘**
			- ◉ **B진수 숫자 N을 10진수로 바꾸기(누적곱)**
			  id:: 687250f4-c492-4481-90b4-2894f302b02d
				- 최종 변환 결과 result 를 0으로 초기화
				- B진수 숫자 N의 가장 왼쪽자리부터 한자리씩 순회하면서 진행
					- 순회하며 읽은 값을 10진수로 바꿈(10 이상의 수는 A=10, B=11 등등), 이 값을 val로 지정
					- result = result*B + val
				- 모든 자리수에 대해 수행하고 나면 최종적으로 result에 10진수로 변환된 숫자가 나옴.
			- ◉ **10진수 숫자 N을 B진수로 바꾸기(나머지 계산법)**
			  id:: 6872521b-6fe5-4b65-a929-38c176052368
				- 최종 변환 결과 result 를 배열로서 초기화
				- N이 0이 될 때까지 반복문을 돌림
					- val = N%B
					- 이때 계산된 val값을 B진수에 맞게 변환에서 result 배열에 삽입.
						- 앞에서부터 순서대로 넣는다.
					- N = N//B
				- result 배열을 맨 마지막 인덱스부터 역순으로 읽으면 그것이 최종 변환 결과.
		- ### **◼︎ 유클리드 호제법(최소공배수, 최대공약수 구하기)**
			- ◉ **최대공약수(GCD) 구하기**
			  id:: 687253f3-7eb2-421e-b8c0-d9b96d4d7323
				- 입력한 두 수의 최대공약수를 구하는 함수 GCD에서 아래의 두 공식이 성립한다.
					- GCD(a, b) = GCD(b, a % b)
					- GCD(a, 0) = a
				- 위의 공식을 바탕으로 다음의 과정을 통해 최대공약수를 구한다.(a>=b)
					- 1. r = a%b
					- 2. a-b, b=r 로 값 갱신
					- 3. b = 0이면, a가 최대공약수
					- 4. b != 0이면 다시 1번부터 실행
				- 유클리드 호제법 gcd 예시코드
				  id:: 687255f3-27a7-4bef-a684-60daab2fa33f
					- 재귀방식
						- ```python
						  def gcd(a,b):
						    return a if b==0 else gcd(b, a%b)
						  ```
					- 반복문 방식
						- ```python
						  def gcd(a,b):
						    while b:
						      a, b = b, a%b
						    return a
						  ```
			- ◉ **최소공배수(LCM) 구하기**
			  id:: 687256b1-be35-4052-a12e-133e2c3b2f50
				- 두 수 a,b와 그 수의 최대공약수(GCD)를 알면 a,b의 최소공배수(LCM)는 다음과 같다.
					- LCM = (a * b) / GCD
	- ### **► 사소한 테크닉**
		- ### **◼︎ 소수점 올림 연산(ceil)**
		  id:: 68725357-aae4-4805-9550-21927cf3731a
			- 대부분의 언어에는 ceil이라는 올림연산 메서드를 지원하지만 사용할 수 없는 환경일 경우에는 다음과 같이 계산한다.
				- ```python
				  ceil(x/y) = (x+y-1)//y
				  ```
		-