CodeKata
-
[CodeKata] 프로그래머스 : 4.7(수), 압축Algorithm 2021. 4. 8. 19:46
🥋 Ooooth!! (Level 2) 우선 문자열을 잘라가는데, 이는 사전에 해당 문자열이 포함되어있어야 한다는 기준을 고려해야 한다. KAKAO를 자르기 시작하면, KA는 사전에 포함되어있지 않으므로 그 전까지인 K의 인덱스를 정답배열에, KA는 사전의 새로운 요소로 추가해주면 된다. 위 일련의 처리가 끝나면, 그 다음부터인 A에서 시작하여, AK, AKA... 순으로 검색하면 된다. (여기서도 AK가 사전에 없으므로 멈추게 되겠지) 🧮 풀이 function solution(msg) { let answer = []; let dic = Array.from({ length: 27 }, (_,i) => String.fromCharCode(i+64)) let s = 0; let e = 1; while (tru..
-
[CodeKata] 프로그래머스: 4.1(목), 방금그곡Algorithm 2021. 4. 3. 18:44
🥋 Ooooth!! (Level 2) 역시 카카오답게 문제가 길다. 우선 musicinfos 의 마지막 요소인 음순서가 음악길이만큼 반복된다. 음악길이는 1,2번째 요소의 시간차이다. 이렇게 완성된 음악에 m이 포함되는지를 확인해서 음악길이가 가장 긴 음악제목(3번째 요소)를 반환하면 된다. 없으면 "(None)". 🧮 풀이 function splitMelody(melody) { return melody.split("").reduce((acc, cur) => { cur = cur === "#" ? acc.pop() + cur : cur; return [...acc, cur] }, []) } function solution(m, musicinfos) { let answer = ''; let timeMax ..
-
[CodeKata] 프로그래머스: 3.29(월), 후보키 / [이론] 비트 연산자Algorithm 2021. 3. 29. 15:41
🥋 Ooooth!! (Level 2) 🧮 풀이 부분집합 등 개념을 활용에서 풀어도 마땅한 방법이 나오지 않았다. 리뷰를 보니 비트 연산자를 활용한 풀이가 많았고, 모범답안을 해석하면서 비트연산자에 대해 간단히 공부했다. 🖇 리뷰 - 모범답안 function solution(relation) { const cols = relation[0].length; const check = 1 x.filter((col,index)=>i & (1 : 지정한 수만큼 비트 전체를 오른쪽으로 이동(right shift) >>> : 지정한 수만큼 비트를 전부 오른쪽으로 이동, 새로운 비트는 전부 0이 된다 & (AND 논리 연산자) 비교하는 비트가 모두 1이면 1 반환 const b1 = 2 & 3; console.log('2..
-
[CodeKata] 프로그래머스 : 3.26(금), 캐시 / [이론] 캐시 교체 알고리즘Algorithm 2021. 3. 26. 20:00
🥋 Ooooth!! (Level 2) LRU 캐시 알고리즘만 이해하면 어려운 문제는 아니다. 캐시는 cacheSize 만큼만 데이터 저장이 가능하며, 캐시 유무에 따라 answer에 1 또는 5를 더하는 것이다. 🧮 풀이 function solution(cacheSize, cities) { let cache = []; let answer = 0; for (let city of cities) { city = city.toUpperCase(); const index = cache.indexOf(city) if (index === -1) { answer += 5; cache.push(city); if (cache.length > cacheSize) { cache.shift(); } } else { answer..
-
[CodeKata] 프로그래머스 : 3.25(목), 프렌즈4블록Algorithm 2021. 3. 25. 16:30
🥋 Ooooth!! (Level 2) 테트리스와 유사하되, 2x2 블록만 깨지는 패턴이다. 주의해야 할 점은, 중첩되는 부분이 있을 수 있으므로 모든 깨지는 경우를 확인한 뒤 전체적으로 지워줘야 한다. 🧮 풀이 function solution(m, n, board) { board = board.map(block => block.split("")) while (true) { let newBoard = JSON.parse(JSON.stringify(board)) let breakPoint = []; for (let x = 0 ; x < m-1 ; x++) { for (let y = 0 ; y < n-1 ; y++) { if (board[x][y] === board[x][y+1] && board [x+1][y..
-
[CodeKata] 프로그래머스 : 3.24(수), 뉴스 클러스터링Algorithm 2021. 3. 25. 02:43
🥋 Ooooth!! (Level 2) 🧮 풀이 10번 케이스에서만 실패가 발생했다. const regex = /^[a-z]*$/; function solution(str1, str2) { str1 = str1.toLowerCase().split("").map((e,i,arr) => e = arr[i+1] && e + arr[i+1]).filter(e => e && regex.test(e)).sort() str2 = str2.toLowerCase().split("").map((e,i,arr) => e = arr[i+1] && e + arr[i+1]).filter(e => e && regex.test(e)).sort() let idx = -1; let common = []; for (let s of str1..
-
[CodeKata] 프로그래머스 : 3.22(월), 예상 대진표Algorithm 2021. 3. 23. 01:08
🥋 Ooooth!! (Level 2) : 예상 대진표 a, b가 항상 이긴다고 가정하면, 다음 번호는 현재 번호를 2로 나눈뒤 반올림한 값이라는 규칙성을 근거로 풀었다. 🧮 풀이 function solution(n,a,b) { let answer = 0; while (a !== b) { a = Math.round(a/2) b = Math.round(b/2) answer++; } return answer; } answer는 정답이자, 라운드 수를 누적할 변수이다. while 반복문을 순회하며, 종료조건은 a와 b가 같아질 때이다. a와 b를 각각, 2로 나눈뒤 반올림한 값으로 최신화한다. (Math.floor) 또한, 각 순회는 곧 라운드가 진행됬다는 의미로, answer에 1을 더해준다. 🖇 리뷰 다른 ..