"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.
- 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있습니다. 바로 "기초가 중요하다"는 것입니다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 합니다.
- 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 노력합니다.
- 그럼 레츠 고 !
보통 특정 값(a, b)를 특정 값(n)으로 나눈 값이 정수인지 아닌지 알수 없을 때, Math.floor()
를 사용한다. 왜냐면 특정 값(a, b)이 짝수는 홀수든 상관 없이 Math.floor()
를 사용하면 정수값만 반환되기 때문이다.
const a = 10;
const b = 13;
const n = 2;
return a / n; // 5
return b / n : // 6.5
return Math.floor( a / n ); // 5
return Math.floor( b / n ); // 6
그럼 Math.floor()
가 없다면 정수값을 가져올 수 없는 것일까? 여기서 주목해야할 특징이 있다. 바로 홀수를 짝수로 나눈 나머지 값은 모두 x.5
라는 것이다.
return 7 / 2 : // 3.5
return 13 / 2 : // 6.5
return 15 / 2 : // 7.5
따라서 특정 값이 홀수인지 짝수인지를 판단해 홀수라면 최종 값에 -0.5를 해준다. 그럼 Math.floor()
를 사용하지 않아도 동일한 값을 얻을 수 있다.
// k가 홀수라면 -0.5
if (k % 2 === 1) {
return k / 2 - 0.5;
} else {
k / 2;
}
문제설명 : array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
입/출력 :
console.log(solution([5, 9, 7, 10], 5)); // [5, 10]
function solution(arr, divisor) {
const divisorArr = arr.filter((v) => v % divisor === 0).sort((a, b) => a - b);
return divisorArr.length > 0 ? divisorArr : [-1];
}
문제설명 : seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요.
입/출력 :
console.log(solution(["Jane", "Kim"])); // "김서방은 1에 있다"
function solution(seoul) {
return `김서방은 ${seoul.indexOf('Kim')}에 있다`;
}
입/출력 :
console.log(solution(6)); // 8
function toEven(n) {
return n / 2;
}
function toOdd(n) {
return n * 3 + 1;
}
function solution(n) {
let count = 0;
while (n !== 1) {
if (n % 2 === 0) {
n = toEven(n);
} else {
n = toOdd(n);
}
count++;
}
return count < 500 ? count : -1;
}
문제설명 : 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
입/출력 :
console.log(solution(10)); // true
function solution(x) {
const sumN = Array.from(String(x))
.map(Number)
.reduce((a, b) => a + b);
return x % sumN === 0;
}
문제설명 : 화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
입/출력 :
console.log(solution("01033334444")); // "*******4444"
console.log(solution("027778888")); // "*****8888"
function solution(phone_number) {
const e = phone_number.length - 4;
const lastN = phone_number.substring(e, e + 4);
const changeN = [...phone_number.substring(0, e)]
.map((v) => "*")
.join("");
return changeN.concat(lastN);
}
function solution(phone_number) {
const e = phone_number.length - 4;
return [...phone_number].fill("*", 0, e).join("");
}
문제설명 : 단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.
입/출력 :
console.log(solution("abcde")); // "c"
function solution(s) {
const e = s.length;
if (e % 2 === 1) {
return s[e / 2 - 0.5];
} else {
return s[e / 2 - 1] + s[e / 2];
}
}
function solution(s) {
const middle = s.length / 2;
if (s.length % 2 === 1) {
return s[middle - 0.5];
} else {
return s[middle - 1] + s[middle];
}
}
문제설명 : 배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
입/출력 :
console.log(solution([1, 1, 3, 3, 0, 1, 1])); // [1,3,0,1]
function solution(arr) {
return arr.filter((v, i) => v !== arr[i - 1]);
}
문제설명 : 길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
입/출력 :
console.log(solution([1, 2, 3, 4], [-3, -1, 0, 2])); // 3
function solution(a, b) {
return a.map((v, i) => v * b[i]).reduce((a, b) => a + b);
}
문제설명 : 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요.
입/출력 :
console.log(solution(3)); // "수박수"
function solution(n) {
let answer = "";
for (let i = 0; i < n; i++) {
answer += i % 2 === 0 ? "수" : "박";
}
return answer;
}
문제설명 : numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
입/출력 :
console.log(solution([1, 2, 3, 4, 6, 7, 8, 0])); // 14
function solution(numbers) {
const n = [1, 2, 3, 4, 5, 6, 7, 8, 9];
return n
.map((v) => !numbers.includes(v) ? v : -1)
.filter((v) => v >= 0)
.reduce((a, b) => a + b);
}