Prefix Sums array의 어떠한 slice라도 sum을 빠르게 계산할 수 있도록 해주는 방법이다. 예를 들어 어떤 배열의 인덱스 i부터 j까지의 합을 구하려고 할 때 for문을 써서 일일이 접근해서 더하면 O(N)이지만, 이 방법을 사용하면 O(1)이다. def prefix_sums(A): n = len(A) P = [0] * (n + 1) for i in range(1, n + 1): P[i] = P[i - 1] + A[i - 1] return P 점화식: P[i] = P[i - 1] + A[i - 1] A라는 배열이 있을 때, A 배열의 sum의 누적값을 계산해서 P에 넣는 것이다. P[i] = P[i - 1] + A[i - 1]으로 계산되고, P[i]는 A 배열의 i번째 원소(인덱스로는 i..
문제 상황 material-ui의 drawer 컴포넌트를 사용하고 있음 부모 컴포넌트(검색 결과를 리스트로 보여주는 페이지)가 자식 컴포넌트인 drawer에게 state(인원 수)를 넘겨줌. drawer는 부모 컴포넌트로부터 받은 인원 수로 state를 초기화하고, drawer내에서 인원 수를 변동시킬 수 있음. drawer 내에서 인원 수를 변동시킨 다음 저장 버튼을 누르면 drawer가 닫히면서 바뀐 인원 수로 검색 api 재호출하여 그 결과를 부모 컴포넌트인 리스트 페이지에 렌더링함. 그런데 문제는 api call이 백그라운드에서 진행되고 있을 때, drawer를 열어서 인원 수를 조작하고 있는 상황에서, api 호출이 끝나고 리스트가 렌더링되면, drawer에서 조작하고 있던 인원 수가 다시 초기..
부모 컴포넌트에서 count라는 state를 갖고 있고 이를 prop를 내려줄 때, 자식 컴포넌트에서 이를 받아 state의 초기값으로 삼았다고 하자. 이후, 부모 컴포넌트에서 갖고 있는 count 값이 변동된다면 자식 컴포넌트가 표시하고 있는 state는 어떻게 될까? 변하지 않는다. 그 이유는 컴포넌트 생성자(constructer)는 컴포넌트가 마운트될 때 한 번만 실행되기 때문이다. constructer는 this.state의 초기값 적용, 인스턴스에 이벤트 처리 메서드를 바인딩 하기 위해 사용한다. class ChildComponent extends Component { constructer() { super(props); this.state = { count: this.props.value };..
잘못된 코드 #include void swap(int a, int b); int main(void) { int x = 1; int y = 2; swap(x, y); printf("x: %i, y: %i\n", x, y); // 여전히 x는 1, y는 2 } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } 위 코드는 swap함수 안의 a와 b의 값을 바꾸기는 하지만, main 함수 안에 x와 y는 바꾸지 못한다. 왜냐면 swap함수로 전달되는 값은 복사된 값(pass by value)이기 때문이다. (참고로 C언어는 자바스크립트나 파이썬과 같은 언어와 달리 전부 pass by value로 넘어간다. object랑 비슷하게 생긴 struct도 마찬가지다...
문자열 복사하기 #include #include #include #include int main(void) { char *s = get_string("s: "); // leo char *t = s; t[0] = toupper(t[0]); printf("s: %s\n, s"); // Leo printf("t: %t\n, t"); // Leo } t에 s를 할당하고, t의 첫글자를 uppercase로 바꾸고 난 뒤 t와 s를 출력하면 두 개 모두 첫글자가 대문자로 출력된다. 왜냐하면 t는 s가 갖고 있는 주소를 가리키고 있기 때문이다. 즉 s가 갖는 주소에 있는 값이 변하면, t도 동일한 것을 보고 있으므로 역시 똑같이 변한 값이 출력된다. #include #include #include #include i..
any와 unknown 모두 모든 타입들의 super set이다. 즉 어떤 타입도 any와 unknown에 넣을 수 있다. 하지만 unknown은 자기 자신과 any를 제외한 다른 타입에 할당할 수 없다. (Anything is assignable to unknown but unknown isn't assignable to anything but itself and any) const vAny: any = 10; // any에 어떤 것도 집어넣을 수 있다. const vUnknown: unknown = 10; // any처럼 unknown에도 어떤 것도 집어넣을 수 있다. let s1: string = vAny; // any는 어떤 것에도 집어넣어진다. let s2: string = vUnknown; /..
string s = "LEO"; 사실 c에는 string이라는 자료형이 없다. 그 간 string이라는 자료형은 만들어진 것이며, 이를 사용하기 위해 라이브러리에서 불러온다는 것은 알고 있었다. 그렇다면 string 자료형은 내부적으로 어떻게 구현이 되어있는 것일까? 전에도 언급했듯이 string은 단지 char의 배열이다. 내부적으로 보면 메모리에 L, E, O, \0(널 종단문자) 순서대로 저장되어있을 것이다. 그러면 변수 s는 어떤 값을 저장하고 있는 것인가? 변수 s는 char 배열의 가장 첫 번째 글자인 L이 위치한 메모리 주소를 값으로 갖고 있다. 즉, s는 포인터 변수이다. s는 char 배열의 첫 번째 글자의 주소만 알고 있고, 그 주소에서부터 시작해서 널 종단 문자가 나올 때까지 loop..
현상 Gradle을 brew로 설치한 후, 설치가 잘 되었나 확인해보려고 gradle -v 을 치니 다음과 같은 에러가 출력됨. ERROR: JAVA_HOME is set to an invalid directory: /usr/local/opt/openjdk/bin/java Please set the JAVA_HOME variable in your environment to match the location of your Java installation. 해결(MacOS) 첫 번째로 자바가 설치되어있는지 확인해봄. java --version 치니 openJDK가 설치되어 있다고 나온다. 두 번째로 자바가 어디 설치돼 있는지 확인해봄. which java 로 자바 위치 확인. JAVA_HOME과 자바 설치 ..
- Total
- Today
- Yesterday
- SQL
- Session
- 개발 공부
- 포인터 변수
- Prefix Sums
- til
- useEffect
- 제네릭스
- 리덕스
- react
- JavaScript
- Java
- package.json
- 인스턴스
- GIT
- rxjs
- youtube data api
- Redux
- this
- getter
- Conflict
- CSS
- 자바
- linkedlist
- 깃
- 알고리즘
- c언어
- Data Structure
- jQuery
- oracle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |