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
를 써서 풀었다:
javascriptfunction solution(n){ return [...`${n}`].reduce((acc, cur) => acc += +cur, 0); }
+cur
는 동작상 문제가 있진 않지만, Number(cur)
가 더 의도가 명확히 보이는 표현일 수 있다. 또, 비슷한 표현으로 [...String(n)]
이 더 의도가 분명하다.
javascriptfunction solution(n){ return [...String(n)].reduce((acc, cur) => acc + Number(cur), 0); }
5. X만큼 간격이 있는 n개의 숫자
이 문제는 정수 x와 자연수 n을 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 배열을 반환해야하는 문제다.
나는 x를 i ~ n번까지 for
문 안에서 곱하며 배열에 추가하는 함수를 아래와 같이 작성했다:
javascriptfunction solution(x, n) { const answer = []; for(let i = 1; i <= n; i++){ answer.push(x * i) } return answer; }
5-1. 아예 그런 Array를 만들어 반환
n개의 요소가, 인덱스에 비례한 규칙을 가지게 하는 배열은 fill
과 map
으로 만들 수 있다.
javascriptfunction solution(x, n) { return Array(n).fill(x).map((v, i) => (i + 1) * v) }
9. 두 정수 사이의 합
이 문제는 문제 제목이 말하는 그대로의 함수를 만드는 문제다. 약간 고려해야할 사항이 있다면 a가 b보다 클수도 있다는 점.
나는 더럽게(..) 풀었다.
javascriptfunction 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()
로 구하는 것이 더 가독성이 좋다.
javascriptfunction adder(a, b, s = 0){ for (let i = Math.min(a, b); i <= Math.max(a, b); i++) s += i; return s; }
9-2. 가우스
이 문제는 근본적으로는 가우스의 합산 식을 사용하면 쉽게 풀 수 있는 문제다.
javascriptfunction adder(a, b){ return (a+b) * (Math.abs(a-b)+1) / 2; }
10. 문자열 내 p와 y의 개수
이 문제는 대소문자와 관련 없이 문자열 안의 p와 y의 개수가 같은지 확인하는 함수를 작성하는 문제다. 나는 아주 정직하게, 우선 문자열의 모든 문자를 대문자로 바꾸어 배열로 옮긴 후 p의 개수, y의 개수를 따로 저장하여 비교하였다.
javascriptfunction 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로 테스트를 해 결과를 비교한다.
javascriptfunction numPY(s){ return s.match(/p/ig).length == s.match(/y/ig).length }
10-2. reduce
reduce
는 여기서도 쓸 수 있다. p일땐 누계에 1을 더하고, y일땐 1을 차감해 최종 누계가 0이면 true
를, 아니면 false
를 반환한다.
javascriptfunction 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
으로 합쳤다.
javascriptfunction solution(phone_number) { return [...phone_number].map((v, i) => i < phone_number.length - 4 ? "*": v).join("") }
19-1. slice 활용하기
slice
는 음수 인덱스를 지원한다. 이를 활용한다.
javascriptfunction 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까지 채운다는 의미)
javascriptconst solution = n => [...n].fill("*",0,n.length-4).join("")