"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.
- 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있습니다. 바로 "기초가 중요하다"는 것입니다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 합니다.
- 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 노력합니다.
- 그럼 레츠 고 !
문제설명 : 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요.
입/출력 :
console.log(solution([4,3,2,1])); // [4,3,2]
function solution(arr) {
const minN = Math.min(...arr);
const deleteMin = arr.filter(v => v !== minN);
return deleteMin.length > 0 ? deleteMin : [-1];
}
문제설명 : 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
입/출력 :
console.log(solution("Zbcdefg")); // "gfedcbZ"
function solution(s) {
return [...s].sort().reverse().join("");
}
문제설명 : 문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요.
입/출력 :
console.log(solution("a234")); // false
function solution(s) {
if (s.length !== 4 && s.length !== 6) {
return false;
}
const isNum = [...s].map(Number).filter((v) => v >= 0); // 숫자만 남김
return s.length === isNum.length;
}
문제설명 : 놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
입/출력 :
console.log(solution(3, 20, 4)); // 10
function solution(price, money, count) {
let answer = 0;
for (let i = 0; i < count; i++) {
answer += price * (i + 1);
}
return money >= answer ? 0 : answer - money;
}
문제설명 : left ~ right까지의 수 중 약수의 개수가 짝수라면 +, 홀수라면 - 한 수를 리턴하세요.
입/출력 :
console.log(solution(13, 17)); // 43
function isEven(n) {
return n % 2 === 0;
}
function countDivisor(n) {
let temp = [];
for (let i = 0; i <= n; i++) {
if (n % i === 0) {
temp.push(i)
}
}
return temp;
}
function solution(left, right) {
let answer = 0;
for (let i = left; i <= right; i++) {
if (isEven(countDivisor(i).length)) {
answer += i;
} else {
answer -= i;
}
}
return answer;
}
문제설명 : 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요.
입/출력 :
console.log(solution(3, 12)); // [3, 12]
function solution(a, b) {
const gcd = (a, b) => (a % b === 0 ? b : gcd(b, a % b));
const lcm = (a, b) => (a * b) / gcd(a, b);
return [gcd(a, b), lcm(a, b)];
}
문제설명 : 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
입/출력 :
console.log(
solution(
[
[1, 2],
[2, 3],
],
[
[3, 4],
[5, 6],
]
)
); // [[4, 6], [7, 9]]
function solution(arr1, arr2) {
return arr1.map((arr, aIndex) =>
arr.map((n, bIndex) => n + arr2[aIndex][bIndex])
);
}
function solution(arr1, arr2) {
const answer = [];
for (let i = 0; i < arr1.length; i++) {
const temp = [];
for (let j = 0; j < arr1[i].length; j++) {
temp.push(arr1[i][j] + arr2[i][j]);
}
answer.push(temp);
}
return answer;
}
문제설명 : n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
입/출력 :
console.log(solution(45)); // 7
function solution(n) {
const a = [...n.toString(3)].reverse().join("");
return parseInt(a, 3);
}
문제설명 : 부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요
입/출력 :
console.log(solution([1,3,2,5,4], 9)); // 3
function solution(d, budget) {
const sorted = d.sort((a, b) => a - b);
let cnt = 0;
for (let i = 0; i < sorted.length; i++) {
budget -= sorted[i];
if (budget < 0) {
break;
}
cnt++;
}
return cnt;
}
문제설명 : t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요
입/출력 :
console.log(solution("3141592", "271")); // 2
function solution(t, p) {
let cnt = 0;
for(let i = 0; i < t.length - p.length; i++) {
const temp = t.slice(i, p.length + i);
if (temp <= p) {
cnt++;
}
}
return cnt;
}