sungyup's.

Web_Miscellaneous / Algorithm(JS) / 4.7 프로그래머스 Lv.0 #61~70

4.7프로그래머스 Lv.0 #61~70

프로그래머스 Lv.0 61~70번

개요

기초 트레이닝 문제(Lv.0) 61 ~ 70번 문제 풀이 중 배울 점이 있는 풀이들에서 배운 개념들을 내 것으로 만들고자 정리해본다.

63. 왼쪽 오른쪽

왼쪽 오른쪽은 예외가 여럿 있는 문제라고 생각해 이렇게 풀었다.

javascript
function solution(str_list) { const indexL = str_list.indexOf("l"); const indexR = str_list.indexOf("r"); if(indexL === -1 && indexR === -1) return []; if(indexL === -1){ return str_list.slice(indexR + 1); } else if(indexR === -1){ return str_list.slice(0, indexL); } if(indexL < indexR){ return str_list.slice(0, indexL); } else { return str_list.slice(indexR + 1); } }

63-1. for문

l과 r 중 먼저 나오는 것이 뭔지에 따라 답이 갈린다는 점을 생각해보면, 아래와 같이 for문을 통해 분기를 나누고 해결 가능하다.

javascript
function solution(arr) { for(let i = 0; i < arr.length; i++) { if (arr[i] === 'l') return arr.slice(0, i); if (arr[i] === 'r') return arr.slice(i + 1); } return []; }

66. 홀수 vs 짝수

홀수 vs 짝수는 나는 reduce가 생각나 아래와 같이 풀었다.

javascript
function solution(num_list) { const accOdd = num_list.reduce((acc, cur, idx) => idx % 2 === 1 ? acc +=cur: acc,0) const accEven = num_list.reduce((acc, cur, idx) => idx % 2 === 0 ? acc +=cur: acc,0) return Math.max(accOdd, accEven); }

66-1. map

map으로 한 번에 even과 odd의 값을 구해서 비교할 수도 있다. 참고로, forEach로도 거의 동일하게 풀 수 있다.

javascript
function solution(num_list) { let even = 0; let odd = 0 num_list.map((v, idx) => { !(idx % 2) ? even += v : odd += v; }) return odd > even ? odd : even; }

66-2. reduce를 한번에

배열에 각각의 합을 넣고 한번에 reduce를 활용할 수도 있다.

javascript
function solution(num_list) { return Math.max(...num_list.reduce(([o, e], c, i) => i % 2 ? [o + c, e] : [o, e + c], [0, 0])); }

67. 5명씩

5명씩은 간단한 문제고 나도 잘 푼 것 같지만, 다른 사람의 풀이 중 꼭 내 답보다 낫다고는 할 수 없지만 그 이유가 중요해서 기억하고자 여기 남긴다.

우선 내 답은 단순한 for문이다.

javascript
function solution(names) { const answer = []; for(let i = 0; i < names.length; i += 5){ answer.push(names[i]) } return answer; }

67-1. filter

filter를 이용한 풀이가 있다. 아래와 같다:

javascript
const solution = names => names.filter((_, i) => !(i % 5))

다만, 이 방식은 매 원소마다 한 번씩 반복하고 조건을 검사한다. for문이 한 번에 5개씩 건너뛰었다면, 이 풀이는 매 원소를 다 체크한다는 것이다. 물론, for문이나 filter나 시간 복잡도는 O(n)이지만 엄밀히 따지면 forO(n/5) = O(n)인 경우기 때문에 5배 적은 시간을 쓴다.

70. 수열과 구간 쿼리 1

쿼리에 있는 숫자들을 이용해 배열을 바꾸는 문제 중 하나다.

javascript
function solution(arr, queries) { queries.forEach(([s, e]) => { while(s <= e){ arr[s]++; s++; } }) return arr; }

70-1. [i++]

나와 사실상 같은 풀이이지만 문법적 측면에서 아래와 같은 것도 가능하다. s도 1 올리고 arr[s]의 값도 1 올린다.

javascript
function solution(arr, queries) { queries.forEach(([s, e]) => { while (s <= e) arr[s++]++; }); return arr; }