코딩테스트 준비 5편.

김영현·2023년 6월 2일
0

포스팅을 한동안 안올렸다. 듣던 강의를 멈추고 일단 복습겸 백준을 여행하고있었다. 안풀리는 문제를 몇시간씩 붙잡고 머리는 터지고 자기전에도 생각났다. 그러다보니 블로그에 소홀히하게되고 눈이 뚫어져라 알고리즘 문제만 보고있는 내가 있었다.

기록을 남기자

기록을 남기지 않고 문제를 막 풀다보니 비슷한 유형의 문제도 못푸는 경우가 생겼다. 답을 못맞췄을때 풀이만 살짝보고 푸는 방식으로 진행했는데, 기억이 애매한 메소드들은 계속 검색해서 사용했다.
=> 메소드나 풀이를 잠깐 보고 풀었더니 문제에 관한 조금씩 날아간다. 애매하게 알던 메소드들과 풀이 방식들은 정확히 인지하고 복습하고, 틀린문제는 비슷한 유형의 문제를 풀어야겠다.

2진수에 약하다

위에 두 문제는 둘다 진법을 활용한 문제다. 나는 당연히 parseInt()toString()을 사용했지만, 실패했다.
문자열로 계산하는것이 아닌, 수학적 사고력으로 푸는것이 중요해보인다.

그래서 비슷한 문제를 찾아 수학적으로 풀어봤다. 이제야 진법이 조금이나마 이해간다.(둘다 수학적 사고로 풀었음)
대신 n진수 => 10진수나, 10진수 => n진수밖에 모르겠음. 따로 n진수 to n진수 변환을 해봐야겠다!

해당하는 문자열 찾기(정규식 공부필요)


1316번은 아직 시도안해봄. 위아래 문제 둘다 긴 문자열에서 해당하는 문자열의 갯수를 세는것이다.
나는 처음에 반복문과 조건문을 사용해서 풀었다. if문으로 경우의 수를 나눴는데, 맞추고나서 다른 사람들의 풀이를 보니
frequencyCounter 패턴처럼 미리 찾아야 하는 문자열의 데이터셋을 객체에 넣어두고 = 밸류쌍으로 찾는것이었다.
이게 더 나은 풀이라고 생각해서 다음 문제(2941번)은 그렇게 풀었다. 풀고나서 또 다른사람의 풀이를 보니
정규식으로 문자열을 찾은 사람이 이 있었다. 이게 훨씬 더 깔끔하고 정규식이라는 메소드가 딱 맞아보였다. 물론 문제의 취지엔 안맞을수도 있지만. 여러방법으로 풀어보는것도 좋아보인다!

2차원 배열

내가 다뤄본 2차원배열은 db에서 받아온 데이터를 가공해서 써본게 전부라 객체도 섞여있기에 명확한 '배열'은 아니었다.리액

그래서 이번에 엄청 후두려 맞을 줄 알았는데, 의외로 할만했다. 문제의 난이도가 낮아서 그런지는 몰라도.
마지막 문제(2563)는 살짝 시간이 걸려서 풀이를 휙 보고왔다. 2차원배열을 0으로 채우고 종이가 차지하는 좌표를 1로 채운다음에 카운팅. 하지만 js에선 빈 배열에 arr[i] 이렇게 접근할수 없다. 다른 언어들은 보통 정적길이를 선언 해서 초기화 하기때문에 접근이 가능했지만. 무튼 어떻게 할까 고민하다가 Array.from메소드를 발견했다.

Array.from

Array.from은 기본적으로 유사배열-객체나 이터러블한 객체를 배열로 바꾸어준다.
유사 배열객체? 이터러블?모던 js deepdive에서 배웠었다.
기억하기론
1. 유사배열객체는 다음과 같다.

const arrayLikeObj = {
  0: value,
  1:value,
  ...
  4:value,
  length:4
}

그러니까 Key를 인덱스처럼 쓰고, 길이가 있는객체다. 이녀석은 Key를 통한 접근이 불가능하다. 또한, 기본 for문으로도 순회가 가능하다.
하지만 일반 객체와는 다르게for-of로 순회가 불가능한데....
이것을 가능케 하는녀석이 이터러블이다

2. 이터러블은 다음과 같다.
es6Symbol이라는 원시타입이 추가되었다. 이녀석은 유니크하다. 그래서 리액트에서 JSX를 생성할때도 Symbol을 사용한다.

이 심볼녀석의 자식에 iterator라는 녀석이 이터러블과 관련이있다. itrate. 뜻 자체가 반복한다는 것이다.
Symbol.iterater를 가진 객체는 for-of순회가 가능하다.
이녀석은 또 신기하게 next()메서드를 가진다는데, 얼핏보면 linkedList같은 구조같다.

profile
모르는 것을 모른다고 하기

0개의 댓글