정규식의 exec메소드는 일치하는 값만 반환하는게 아니라, [ '2', index: 2, input: 'is2 Thi1s T4est 3a', groups: undefined ] 이렇게 반환해준다. 인덱싱을 이용해서 값을 받아와야함.
string으로 받은 town 리스트(towns)에서, 특정 town이 존재하는지 검사하기 위해 towns.includes()를 사용했다. 하지만 이러면, "Lon"을 town으로 주면, "London"에 Lon을 보고 찾은걸로 인식해서, true를 반환하는 오류가 있는 함수가 되었다(towns의 이름과 완벽하게 일치하는지를 검사하고 싶었음). towns를 Array로 변환해서 includes를 사용하던가, 정규식을 이용하는 방법으로 해결해야함.
Object를 순회하기 위해서는 for in이나 Object.keys, Object.values, Object.entries 메소드를 사용하면 됨.(후자가 성능이나 활용성면에서 좋아보임)
숫자의 한자리씩을 추출하기 위해, %와 /를 사용했다.
while (n !== 0) {
result += n % 10;
n = n / 10;
}
c++의 정수 자료형을 사용하던 때의 습관이 남아있는 것 같다. 위의 코드는 456 % 10 = 6이고, 456 / 10은 내 계획대로라면 45여야 하지만, 45.6이 된다. javascript의 Number는 integer가 아님을 항상 생각하자.
substring(i, 8)은 i부터 i + 8까지 자르는게 아니라, i부터 8까지이다.
변수앞에 this.를 붙여줘야함.
instanceof은 객체의 프로토타입을 검사하는 연산자이기 때문에 string, boolean등의 primitive type에 대해서 작동하지 않는다. primitive type을 검사하기 위해선 typeof를 사용하자.
const arr = Array.from({ length: 10 }, false); // 오류!
const arr = Array.from({ length: 10 }, () => false); // 콜백함수를 전달해야한다.
내부 함수를 이용해 코드를 작성했는데, 결과가 초기화되어있는 상태 그대로 나온다면, 작성한 내부 함수를 호출했는지 살펴보자.
list1 !== null && list2 !== null;
// 둘중 하나라도 null이 되면 false임. (둘다 null이 아니어야 함)
// 헷갈리면 드모르간 법칙을 이용해 볼 수도 있겠다.
undefined와 0을 검사하기 위해 다음과 같은 식을 작성했다.
if (someValue == 0)
위처럼 작성하면, someValue가 undefined일 때, undefined와 0가 false로 형변환이 되어서, true가 나올 줄 알았는데, 논리연산자를 사용한게 아니라서, boolean으로 형변환이 되지 않는 것이었다. 스택 오버플로우에 좋은 글이 있으니 한번 읽어보자. https://stackoverflow.com/questions/40615844/why-undefined-is-not-equal-to-zero-in-javascript
2차원 배열 순회중, 방문한 곳을 표시하기 위해 다음과 같은 코드를 작성했다.
visited[`${y}${x}`] = true;
위의 코드느 오류의 원인이 되었다. 서로 다른 좌표가 같은 표현으로 저장될 수 있기 때문이다. 예를 들어 (1, 15)와 (11, 5)는 둘다 "115"로 저장된다. 이러한 케이스를 구별하기 위해 y와 x사이에 구분자를 넣도록 하자.
예제 인풋이 정렬되어있어서 인풋을 이용해 이진탐색을 했는데, 나중에 정렬되어있지 않은 인풋이 들어와 오류가 발생했다. 앞으로 이진탐색을 이용할땐, 배열이 정렬되어있는지 꼭 확인하고, 정렬되어있지 않다면 정렬해야한다.
Object.keys같은 메서드는 O(n)의 시간복잡도를 가진다. 따라서 해당 메서드를 반복문 안에서 사용하면 시간복잡도를 크게 늘릴 수 있다. 반복문 밖에서 한번 호출해서, 값을 저장한 후 사용하자.
큐를 이용한 bfs를 구현하다 낸 실수, 큐에서 노드를 하나씩 빼면서, 큐의 길이가 줄어들어, 예상한 것보다 for문이 일찍 종료됨.
알파벳을 표현한 0~25사이의 입력을 받았을 때, 이것을 알파벳으로 변경할 때 그대로 사용함.
'a'.charCodeAt(0)를 더해줘야 알파벳으로 변경할 수 있다.
유효한 좌표인지 검사하는 로직을 총 2개를 넣어야 한다.
- shift 직후
- push 직전
그렇지 않으면 무한 루프에 빠질 수 있다.
- shift랑 unshift가 헷갈린다...
- shift는 밖으로 빼는 거, unshift는 집어넣는 건데...
- shift는 옮긴다는 뜻을 가지고 있는데, 배열 밖으로 옮긴다고 생각하면 도움이 될까?