일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 타입 좁히기
- 공변성
- async/await
- webpack
- 무한 스크롤
- 태그된 유니온
- recoil
- React
- 반공변성
- useAppDispatch
- Cypress
- Promise
- 리터럴 타입
- RTK Query
- TS
- SSR
- Jest
- dfs
- autosize
- 투포인터
- 호이스팅
- map
- 인터섹션
- 결정 알고리즘
- 이분 검색
- app router
- tailwind
- CORS
- CI/CD
- ESlint
- Today
- Total
목록코딩테스트 with JS/자바스크립트 알고리즘 문제풀이(인프런) (36)
짧은코딩
문제 풀이 처음 내가 생각한 풀이 function solution(times) { let answer = 0; let ary = times.slice(); ary.sort((a, b) => a[0] - b[0]); let count = 0; for (let i = 0; i answer) answer = count; } else { count = 0; break; } } } return answer; } 내가 생각한 풀이는 리스트를 들어온 시간 순서대로 정렬하고 처음 들어..
LRU 해결 방법 해결 방법으로는 내장 함수를 사용하지 않는 방법과 내장 함수를 사용하는 방법 2가지가 있다. 나는 이 문제를 처음 풀 때 꼼수를 사용하여 맨 뒤부터 불러오는 방식으로 풀려고 했지만 이 방식은 옳은 방법이 아니였다. 방법1) 내장 함수를 사용하지 않는 방법 1. pos는 히트가 되었는지 안되었는지 확인할 수 있는 변수이다. 만약 pos가 -1이면 히트가 되지 않은 것, pos가 -1이 아니면 히트가 된 것이고 pos에 히트 된 위치를 저장한다. 2. pos가 -1이면 히트가 되지 않았기 때문에 answer에 들어간 모든 값들을 뒤로 한 칸씩 밀어주고 맨 앞에 현재 값을 넣는다. 3. pos가 -1이 아니면 히트가 되었기 때문에 히트 된 앞 부분부터 뒤로 한 칸씩 밀어주고 맨 앞에 현재 값..
해결법 이 문제는 일단 왕자의 수 만큼 배열에 넣어둔다. 그리고 우선 k-1만큼 앞 왕자를 빼서 뒤로 보낸다. 그리고 k번째 왕자가 있는 숫자를 제거한다. 이것을 1명의 왕자가 남을 때 까지 반복하면 된다. 코드
해결법 이 문제는 스택으로 해결할 수 있다. 만약 괄호가 "("이면 스택에 넣는다. 그러다가 ")"를 만나면 2가지 케이스로 나뉜다. 우선 무조건 스택에 있는 "(" 1개를 삭제한다. 그리고 앞이 "("이면 레이저라서 스택에 있는 "(" 개수만큼 answer에 더해준다. 앞이 ")"이면 막대가 끝난거라서 잘리고 남아있는 막대 1개를 answer에 더해준다. 코드
모든 이나그램 찾기 해결법 이 문제는 해쉬, 투포인터를 활용해서 풀어야 하는 문제이다. 처음에 생각한 풀이와 답의 로직이 한 70% 정도는 유사했다. 하지만 해쉬의 자료구조인 Map를 비교할 때가 문제였다. 그래서 처음에는 배열로 바꿔서 비교했지만 쉽지 않았고 해결하지 못했다. 강사님의 코드를 보면 두 Map 중 하나를 for문으로 돌리고 나머지 Map를 맞춰보는 형식으로 풀었다. Map은 valuse 값이 0이 된다고 해서 삭제되는 것이 아니기에 만약 value가 0이면 delete로 삭제해줘야 한다. 코드
해결법 처음에 나는 이 문제를 객체를 이용해서 풀었다. 하지만 이 문제는 Map이란 자료구조를 사용하면 쉽게 풀 수 있다. let hash = new Map(); 이렇게 생성할 수 있다. hash.has(x): x가 포함되어 있는지 알 수 있다. hash.set(x, 1): x라는 문자를 1로 초기화해준다. hash.get(x): x의 key 값을 가져와 준다. 코드
해결법 이 문제도 투포인터를 사용하면 쉽게 해결된다. lt을 왼쪽, rt를 오른쪽으로 두고 rt를 하나씩 증가 시켜보면서 sum과 같으면 answer을 증가시키면 된다. 만약 rt를 더하다가 m보다 더 커지면 lt에 있는 값을 빼고 lt 인덱스를 1 증가 시킨다. 이때 sum이 m과 같은지 확인하면 된다. 코드
투 포인터 이런 a와 b 배열이 있으면 pa = pb = 0으로 먼저 초기값을 둔다. while문을 두 배열 중 하나라도 끝에 도달하면 끝낸다. 이때 a[pa]와 b[pb]가 같으면 answer 배열에 추가 해주면된다. 하지만 다르면 두 값 중에 작은 값을 가진 pa/pb를 1 증가시킨다. 코드
해결법 모든 경우의 수를 다 구해야 하기 때문에 모든 경우를 다 구한 다음에 비교를 하면 된다. 이때 Set에 넣어서 구하면 된다. Set는 중복된 값을 허용하지 않기 때문에 Set를 활용하면 된다. 그리고 Set를 정렬할 때는 Array.from으로 배열로 바꿔서 하면 된다. 내 코드
해결법 이 문제는 가장 비싼 선물을 할인 받는다고 해서 선물 받을 수 있는 최대 학생 수를 구할 수 없다. 따라서 모든 경우의 수를 다 해봐야 한다. 그래도 가장 싼 선물부터 계산해보는 것이 효율적이니 오름차순으로 정렬을 했다. 그리고 for문으로 첫 번째 선물부터 마지막 선물까지 다 할인을 적용했다치고 각 경우에 대해서 계산을 해야한다. 따라서 이중 for문을 이용해서 이를 구한다. 각 선물을 계산 할 때 마다 cnt 변수를 ++해준다. 주의할 점은 product와 m은 계속 써야하는 변수라서 다른 변수에 넣어두고 사용해야 한다. 그 후에 answer에 answer, cnt 값 중 더 큰 것을 넣어주면 된다. 코드