sungyup's.

algorithm_programmers / Lv.1 / 2.1 프로그래머스 Lv.1 #1~20

2.1프로그래머스 Lv.1 #1~20

프로그래머스 Lv.1 1~20번

개요

프로그래머스에 자바스크립트로 풀 수 있는 Lv.1 문제는 총 82문제가 있다. 정답률 높은 문제 순, 1 ~ 20번 문제 풀이 중 배울 점이 있는 풀이들에서 배운 개념들을 내 것으로 만들고자 정리해본다.

1. 자릿수 더하기

이 문제는 [https://school.programmers.co.kr/learn/courses/30/lessons/12931] 자연수 n을 주면 자릿수를 다 더하라는 문제로, 문제 자체는 lv.0급이다. 나는 우선 해당 수를 배열로 푼 다음 reduce를 써서 풀었다:

javascript
function solution(n){ return [...`${n}`].reduce((acc, cur) => acc += +cur, 0); }

+cur는 동작상 문제가 있진 않지만, Number(cur)가 더 의도가 명확히 보이는 표현일 수 있다. 또, 비슷한 표현으로 [...String(n)]이 더 의도가 분명하다.

javascript
function solution(n){ return [...String(n)].reduce((acc, cur) => acc + Number(cur), 0); }

5. X만큼 간격이 있는 n개의 숫자

이 문제는 정수 x와 자연수 n을 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 배열을 반환해야하는 문제다.

나는 x를 i ~ n번까지 for문 안에서 곱하며 배열에 추가하는 함수를 아래와 같이 작성했다:

javascript
function solution(x, n) { const answer = []; for(let i = 1; i <= n; i++){ answer.push(x * i) } return answer; }

5-1. 아예 그런 Array를 만들어 반환

n개의 요소가, 인덱스에 비례한 규칙을 가지게 하는 배열은 fillmap으로 만들 수 있다.

javascript
function solution(x, n) { return Array(n).fill(x).map((v, i) => (i + 1) * v) }

9. 두 정수 사이의 합

이 문제는 문제 제목이 말하는 그대로의 함수를 만드는 문제다. 약간 고려해야할 사항이 있다면 a가 b보다 클수도 있다는 점.

나는 더럽게(..) 풀었다.

javascript
function solution(a, b) { if(a === b) return a; let big, small; if(a < b){ big = b; small = a; } else { big = a; small = b; } let answer = 0; for(let i = small; i <= big; i++){ answer += i; } return answer; }

9-1. small, big을 직접 for 조건문 안에서 구하기

사실 for문 안에서 보다 작은 값, 큰 값을 Math.min()Math.max()로 구하는 것이 더 가독성이 좋다.

javascript
function adder(a, b, s = 0){ for (let i = Math.min(a, b); i <= Math.max(a, b); i++) s += i; return s; }

9-2. 가우스

이 문제는 근본적으로는 가우스의 합산 식을 사용하면 쉽게 풀 수 있는 문제다.

javascript
function adder(a, b){ return (a+b) * (Math.abs(a-b)+1) / 2; }

10. 문자열 내 p와 y의 개수

이 문제는 대소문자와 관련 없이 문자열 안의 p와 y의 개수가 같은지 확인하는 함수를 작성하는 문제다. 나는 아주 정직하게, 우선 문자열의 모든 문자를 대문자로 바꾸어 배열로 옮긴 후 p의 개수, y의 개수를 따로 저장하여 비교하였다.

javascript
function solution(s){ const str = [...s.toUpperCase()]; if(!str.includes('P') && !str.includes('Y')) return true; const nump = str.filter(v => v === 'P').length; const numy = str.filter(v => v === 'Y').length; return nump === numy; }

10-1. 정규표현식

정규표현식을 써서 풀 수 있다. //안에 문자를 넣어 해당 문자와 일치하는 것을 찾고, i 플래그로 대소문자를 무시, g 플래그로 하나가 아니라 전체를 검색할 수 있도록 한다. p와 y로 테스트를 해 결과를 비교한다.

javascript
function numPY(s){ return s.match(/p/ig).length == s.match(/y/ig).length }

10-2. reduce

reduce는 여기서도 쓸 수 있다. p일땐 누계에 1을 더하고, y일땐 1을 차감해 최종 누계가 0이면 true를, 아니면 false를 반환한다.

javascript
function solution(s){ return [...s.toLowerCase()].reduce((acc, cur) => { if(cur ==='p') return acc + 1; else if(cur ==='y') return acc - 1; return acc; }, 0) ? false : true; }

19. 핸드폰 번호 가리기

핸드폰 번호 가리기는 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *로 가린 문자열을 반환하는 함수를 작성하는 문제다.

나는 배열로 바꾼 후, map으로 index에 따라 원래 value를 return할지, *로 바꿀지 정하는 함수를 넣고 최종적으로 join으로 합쳤다.

javascript
function solution(phone_number) { return [...phone_number].map((v, i) => i < phone_number.length - 4 ? "*": v).join("") }

19-1. slice 활용하기

slice는 음수 인덱스를 지원한다. 이를 활용한다.

javascript
function hide_numbers(s){ return "*".repeat(s.length - 4) + s.slice(-4); }

19-2. Array.fill 활용하기

Array.prototype.fill(value, start?, end?)를 활용한다. 여기서 start는 시작 인덱스(기본값 0), end는 끝 인덱스로, fill은 이 직전까지 채운다.(기본값이 array.length이므로 array.length - 1까지 채운다는 의미)

javascript
const solution = n => [...n].fill("*",0,n.length-4).join("")