회고

[취업준비일지] - 122

Happy Programmer 2023. 2. 19. 23:23

1.Snippet에 대해 전혀 생각해본적이 없었고
알고리즘 강의에서 테스트를 위해 작동하는 것만 보며
Snippet은 알고리즘 문제를 풀 때 사용하는 도구정도로만 생각하고 있었다.

99.9% 알고리즘 용도 및 0.1% 중요 메서드/기능 저장용도로 사용했다..

가끔 화면 공유로 스니펫을 사용하는 모습을 본 팀원이나 동기분들이
스니펫에서 알고리즘 문제를 푸시네요? 라는 살짝 의아함이 담긴 질문도 하셨지만

다들 다른 곳에서 하시나보다 생각만 하고 넘어갔었는데 사실은 용도 자체가 달랐던 것이다.

 

스니펫은 각종 도구에 내장되어있는 기능 중 하나로
한국어로는 코드 조각이라고 번역 할 수 있다고 한다.

VSC에서는 React Snippet을 위해 
".js" 확장자의 언어 모드를 JavaScript React로 변경한 다음
스니펫을 위한 코드를 xxx.js에 작성한 다음 
https://snippet-generator.app/ 라는 스니펫 생성기를 사용한 코드를
Configure Snippet의 javascriptreact.json에 복사해 저장하면 된다.

또한 개발자 도구에 존재하는 스니펫들 또한 
현재 웹페이지에 직접적으로 영향을 줄 수 있는 함수였기 때문에
특정 스니펫 동작 시 웹페이지가 변하는 모습을 볼 수도 있다.

하지만 DOM 조작을 하지 않고 사용했기 때문에
여태까지는 이런 기능이 있다는 사실을 모르고 있었다.


2.V8은 C++로 작성된 Google의 고성능 JavaScript 및 WebAssembly 오픈 소스 엔진으로
Chrome 및 Node.js 등에서 사용된다.

v8이 JS를 작동시키는 원리는 아래와 같다.

1.JS Code를 Parser에게 넘긴다.
2.Parsing한 데이터를 Abstract Syntax Tree(추상 구문 트리)로 변환한다.
3.완성된 추상 구문 트리(AST)를  Ignition(바이트 변환기)에게 넘긴다.
4.Ignition가 변환한 바이트 코드를 작동시킨다.
5.작동 중 자주 사용되는 경우 TurboFan이라는 compiler를 통해 최적화한다.
6.최적화된 코드의 사용 빈도가 줄어들 경우 최적화를 해제한다.

 


3.TypeScript는 공통 타입 변환을 용이하게 하기 위해 몇 가지 유틸리티 타입을 제공하는데
이런 유틸리티들은 전역으로 사용할 수 있다.

아래와 같은 종류들의 유틸리티 타입이 존재하며

Partial<T>
Readonly<T>
Record<K,T>
Pick<T,K>
Omit<T,K>
Exclude<T,U>
Extract<T,U>
NonNullable<T>
Parameters<T>
ConstructorParameters<T>
ReturnType<T>
InstanceType<T>
Required<T>
ThisParameterType
OmitThisParameter
ThisType<T>

 

주로 사용되는 타입은 Partial, Pick, Omit이며
Readonly, Record, Exclude, Extract, NonNullable도 종종 사용된다.
대표적인 부분만 보자면 

Partial<T> - 해당 타입의 일부분만 사용할 수 있다. (옵셔널 체이닝과 유사 기능)
Pick<T,K> - T에서 프로퍼티 K의 집합을 선택해 타입을 구성한다.
Omit<T,K> - T에서 K를 제거한 타입을 구성한다.
Readonly<T> - T의 모든 프로퍼티를 읽기 전용으로 설정된 타입으로 구성한다.
Record<K,T> - 타입 T의 프로퍼티의 집합 K로 타입을 구성(각각의 T가 각각의 K 내부에 속한다)
Exclude<T,U> - 겹치는 타입을 제외하는 유틸리티 타입으로 대칭차집합이라고 할 수 있다.
Extract<T, U> - 겹치는 타입만 포함하는 유틸리티 타입으로 교집합이라고 볼 수 있다.
NonNullable<T> - NaN, undefined가 아닌 값만 통과시킨다.


유틸리티 타입을 통해 편하게 타입 확장 또는 제한이 가능하기 때문에
자주 사용되는 유틸리티 타입은 무슨 기능이 있는지 정도라도 외워두는 것이 필요하다.
하지만 Partial 같은 유틸리티를 자주 사용하면 any type과 다를 바 없어질 수 있기 때문에
목적에 맞는 방식으로 사용해야 한다.



(1).백준 2309번 일곱 난쟁이는 9명 중 난쟁이 7명만 골라내는 문제였다.
일곱난쟁이의 키의 합이 딱 100이었기 때문에 구별할 수 있다고 하는데
모두 합한 다음 조합을 통해 두명씩 그룹지어 합에서 빼고
그 값이 100이 되는 경우 그 둘을 뺸 나머지를 출력했다.

중간에 자꾸 틀려서 원인을 확인해보니
fucntion으로 만든 것이 아니기 때문에 result에 계속 값이 들어가는 것을 알 수 있었고
이를 해결하기 위해 이전에 배웠던 for문에 label을 붙여준 다음 통과할 수 있었다.

이걸 모를 때는 탈출을 위한 상태값을 만든 다음
for문이 돌 때 마다 해당 값이 되면 탈출 후 탈출 등을 하는 방식을 이용하거나
function으로 재조립 한 다음 return으로 해결해줬지만
이제 label을 반복문에 사용할 수 있다는 걸 알기 때문에
원인을 알고 나니 쉽게 해결할 수 있었다.

const input = `10
10
10
10
10
30
20
10
10`.split('\n').map(Number).sort((a,b) => a-b)

let sum = 0
const result = []
for(let i = 0 ; i < input.length ; i++){
    sum += input[i]
}

outer:for(let i = 0 ; i < input.length ; i++){
    for(let j = i+1 ; j < input.length ; j++){
        if(sum - input[i] - input[j] === 100){
            for(let k = 0 ; k < input.length ; k++){
                if(k !== i && k !== j){
                    result.push(input[k])
                }
            }
            break outer
        }
    }
}

console.log(result.join('\n'))