ericagong / algorithm_solving

2 stars 0 forks source link

Programmers level2 복습 #98

Closed ericagong closed 2 weeks ago

ericagong commented 1 year ago

다시 풀어볼 문제

[프렌즈4블록] #63 [두 큐 합 같게 만들기] #72 [메뉴리뉴얼] #73 [방금 그곡] #74

성찰

52 캐시

  1. Array.prorotype.slice(start, end) vs Array.prototype.splice(start, deleteCount, item1, item2, itemN) 차이
  2. Array.prorotype.find(func), Array.prototype.findIndex(func) vs Array.prototype.indexOf(value) va Array.prototype.includes(searchElement, fromIdx) 차이

51 튜플

  1. regex를 사용할지, String.prototype 메서드를 사용할지 빨리 의사결정하고 구현하기. s = "{{2},{2,1},{2,1,3},{2,1,3,4}}" -> [ 2, 2, 1, 2, 1, 3, 2, 1, 3, 4] /\d+/g.match(input) s.replace(/[{}]/g, '').split(',').map(Number)
  2. 등장 횟수 카운트 시, Array.prototype.filter나 Map 사용

49 뉴스클러스터링

Array.prototype.reduce empty array로 호출 시 init value 없으면 런타임 에러 발생 ⭐ 따라서 반드시 init value 0으로 넣어주는 습관 들이기 ⭐ 대/소문자 상호 변경 시 string.prototype.toUpperCase, string.prototype.toLowerCase 사용 ⭐ 등장 횟수 셀 때, Array.prototype.filter를 통해 간단히 셀 수 있으면 우선 사용. (Map은 추후 사용)

50 k진수에서 소수 개수 구하기

  1. isPrime 알고리즘
    • <= 1이면 소수 아님. *1도 소수 아님.
    • [2, Math.sqrt(n)] 사이 나눗셈 수행. *<= Math.sqrt()
  2. Number K진수 변환: Number.prototype.toStrting(base) 사용 * base 없으면 10진수 문자열로 변환.

54 압축

  1. Array.prototype.slice vs Array.prototype.splice vs Array.prototype.substr 차이
  2. Map/Set에 초기값 빠르게 설정하는 방법: for문 사용해 key에 맞는 인덱스 추가

58 n진수 게임

  1. Number.prototype.toString([base])는 9가 넘는 경우, 소문자 알파벳을 반환하므로 String.prototype.toUpperCase() 처리 필요

61 주차 요금 계산

  1. 문제 꼼꼼하게 잘 읽기. 오해하면 최소 -30분!
    • 여기서는 주차 요금을 하루에 한 번 계산.
  2. for-in문(객체용)과 for-of(Iterable 순회)문 헷갈려서 작성하지 않기. 안 돌아갈 수 있음.
  3. 오타 주의하기 ||를 |로 쓰면 이상한 곳에서 버그 발생

오픈 채팅방

62 파일명 정렬

  1. 정규 표현식 사용 const reg = /(\D*)([0-9]*)/i;
  2. String 빌트인 내장 객체 사용 String.prototype.match(regex) -> [ '12', index: 3, input: 'img12.png', groups: undefined ]

63 프렌즈 4블록

  1. 2차원 배열 90도 회전.
    let b = Array.from(Array(n), () => Array(m).fill(X))
    board.forEach((row, i) => {
    for(let j = 0; j < row.length; j++) {
    b[j][i] = row[j]
    }
    })
  2. 상/하/좌/우 당기기 방식 -> String.prototype.padStart String.prototype.padEnd 적절히 사용 const toRight = row.join('').replaceAll(X, '').padStart(m, X).split('')

80 괄호 변환

  1. 예외처리해서 빨리 종료할 수 있는 조건이 확실하다면 시간 단축을 위해 처리해주기 예_ 처음부터 균형 잡힌 문자열이면 바로 반환 ⭐ 단, 확실하지 않다면 도전하지 말자!
  2. 반환값을 템플릿 문자열로 작성하면 가독성이 좋음
  3. 문자열 -> 배열 변환하는 방법 (1) Array.prototype.from(Iterable/array-like obj) (2) [...str]
  4. 문제 조건이 확실히 while문으로 처리된다면, 굳이 어렵게 for문 사용하지말고 while로 처리해 간단하게 처리하라 ⭐ ⭐ ⭐

72 두 큐 합 같게 만들기

⭐ 투 포인터 풀이 방향

  1. 특정 범위가 만족해야할 조건 정의하기
  2. while문의 종료 조건 파악하기: eg. 1 ≤ queue1의 길이 = queue2의 길이 ≤ 300,000 조건에 의해 300000으로 잡아서 for문을 돌려줄 수 있음 -> 종료 조건 파악이 어렵다면, 우선 시도해보기 : 길이 * 2, 3, ....

73 메뉴 리뉴얼

⭐ 성찰 조합이나 순열 구할 때, 사전 정렬이 필요한지 꼭 점검하기 💡 단, 이 때, 조합 'AB' = 'BA', 'ABCD' = 'DBAC' 으로 동일해야하므로, 조합을 구하기 전, 반드시 문자열을 정렬 처리 💡 DFS로 조합 구할 때는 순열과 다르게 DFS(cnt, startIdx)로 시작 인덱스 필요(이전까지 확인한 부분은 재처리할 필요가 없기 때문) 자료 구조 내 등장 횟수 count시 -> new Map() 사용. map.prototype.set, get, size 활용

74 방금 그 곡

⭐ 성찰

  1. A#을 a로 치환해 A와 A# 구분. (길이를 유지해야하기 때문에 해당 방식 사용) ㄴ String.prototype.replace

  2. 문자열 반복 및 자르기에 각각 String.prototype.repeat(횟수), String.prototype.slice(startIdx, endIdx) 사용

  3. cf) 배열 반복 및 자르기에 각각 Array.prototype.concat()을 반복 처리, Array.prototype.slice(startIdx, endIdx) 사용

  4. 시간 구하는 함수: (new Date() - new Date(1995-10-31 08:00:00)) / 60000 형태로 간단히 계산 가능

81 수식 최대화

  1. 가능한 케이스가 많지 않은 경우라면 굳이 DFS 할 필요 없이 하드 코딩 하는 것도 괜찮음.
    • 코테에서 하드코딩도 하나의 풀이법이 될 수 있다는 점을 늘 인지하기!
  2. 계산 시, stack.pop()을 이용하여, 마지막 계산 값에 접근 가능!