프로그래머스
-
[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을 더해준다. 🖇 리뷰 다른 ..
-
[CodeKata] 프로그래머스 : 3.20(토), 점프와 순간이동 & 영어 끝말잇기Algorithm 2021. 3. 20. 15:15
🥋 Ooooth!! (Level 2) : 점프와 순간이동 이동할 거리 N까지 최대한 순간이동으로 가는 것이 이득이다. 역발상으로, N을 0이 될 때까지 2로 나누고 (이는 모두 순간이동에 해당), 나머지가 1인 경우에만 점프로 이동한다는 개념으로 접근했다. 🧮 풀이 function solution(n) { let ans = 0; while (n > 0) { if (n%2 === 1) ans++; n = Math.floor(n/2) } return ans } ans는 반환할 정답이자, 점프한 횟수이다. while 반복문을 n이 0이 될 때까지 순회한다. 만약, 현재 n을 2로 나눈 나머지가 1인 경우, 점프에 해당하므로 ans에 1을 더한다. 그리고, n을 계속해서 Math.floor() 를 통해 2로 나..